|
|
@@ -0,0 +1,872 @@
|
|
|
+/*
|
|
|
+ Copyright 2013 Scott Logic Ltd
|
|
|
+
|
|
|
+ Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
+ you may not use this file except in compliance with the License.
|
|
|
+ You may obtain a copy of the License at
|
|
|
+
|
|
|
+ http://www.apache.org/licenses/LICENSE-2.0
|
|
|
+
|
|
|
+ Unless required by applicable law or agreed to in writing, software
|
|
|
+ distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+ See the License for the specific language governing permissions and
|
|
|
+ limitations under the License.
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+#import "ScannerViewController.h"
|
|
|
+@import AVFoundation;
|
|
|
+#import <AudioToolbox/AudioToolbox.h>
|
|
|
+#import "SCShapeView.h"
|
|
|
+#import "ScannerControllerView.h"
|
|
|
+//#import "DetailViewController.h"
|
|
|
+#import "const.h"
|
|
|
+#import "AppDelegate.h"
|
|
|
+//#import "MainViewController.h"
|
|
|
+//#import "ContactListViewController.h"
|
|
|
+//#import "CartUtils.h"
|
|
|
+
|
|
|
+#define SCANNER_TARGET_DETAIL 0
|
|
|
+#define SCANNER_TARGET_CART 1
|
|
|
+
|
|
|
+
|
|
|
+//#import "ScannerControlViewController.h"
|
|
|
+@interface ScannerViewController () <AVCaptureMetadataOutputObjectsDelegate> {
|
|
|
+ AVCaptureVideoPreviewLayer *_previewLayer;
|
|
|
+ SCShapeView *_boundingBox;
|
|
|
+ NSTimer *_boxHideTimer;
|
|
|
+ UILabel *_decodedMessage;
|
|
|
+}
|
|
|
+@end
|
|
|
+
|
|
|
+@implementation ScannerViewController
|
|
|
+
|
|
|
+//- (UIInterfaceOrientationMask)supportedInterfaceOrientations
|
|
|
+//{
|
|
|
+// return UIInterfaceOrientationMaskPortrait;
|
|
|
+//}
|
|
|
+//- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
|
|
|
+//{
|
|
|
+//
|
|
|
+// return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
|
|
|
+//
|
|
|
+//}
|
|
|
+- (BOOL)shouldAutorotate
|
|
|
+{
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
|
|
|
+{
|
|
|
+
|
|
|
+
|
|
|
+ [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
|
|
|
+ CGRect rect=self.view.bounds;
|
|
|
+
|
|
|
+ DebugLog(NSStringFromCGRect(self.focusZone.frame));
|
|
|
+ // rect.origin.y=rect.origin.y+40;
|
|
|
+ // rect.size.height = rect.size.height-40;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ [CATransaction begin];
|
|
|
+ [CATransaction setAnimationDuration:0.5];
|
|
|
+ [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
|
|
|
+// [self updatePreviewLayerForOrientation:toInterfaceOrientation];
|
|
|
+ _previewLayer.position = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
|
|
|
+
|
|
|
+ // self.backgroundView.highLightRect = CGRectInset(self.focusZone.frame,6,6);
|
|
|
+ _previewLayer.bounds = rect;
|
|
|
+
|
|
|
+ UIInterfaceOrientation orientation = [[UIApplication sharedApplication]statusBarOrientation];
|
|
|
+ switch (orientation) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ case UIInterfaceOrientationPortrait:
|
|
|
+ // [_previewLayer setAffineTransform:CGAffineTransformMakeRotation(0)];
|
|
|
+
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationPortrait;
|
|
|
+ break;
|
|
|
+ case UIInterfaceOrientationPortraitUpsideDown:
|
|
|
+ //[_previewLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI)];
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationPortraitUpsideDown;
|
|
|
+ break;
|
|
|
+ case UIInterfaceOrientationLandscapeLeft:
|
|
|
+ // [_previewLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI/2)];
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationLandscapeLeft;
|
|
|
+ break;
|
|
|
+ case UIInterfaceOrientationLandscapeRight:
|
|
|
+ // [_previewLayer setAffineTransform:CGAffineTransformMakeRotation(-M_PI/2)];
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationLandscapeRight;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ [CATransaction commit];
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+//- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
|
|
|
+//{
|
|
|
+// return UIInterfaceOrientationPortrait;
|
|
|
+//}
|
|
|
+-(void) playSound
|
|
|
+{
|
|
|
+
|
|
|
+ /*
|
|
|
+ SystemSoundID sameViewSoundID;
|
|
|
+ // NSString *filePath = [[NSBundle mainBundle]pathForResource:@"sound" ofType:@"m4r"];
|
|
|
+ // NSString *thesoundFilePath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"]; //音乐文件路径
|
|
|
+ NSString *path = @"/System/Library/Audio/UISounds/begin_video_record.caf";
|
|
|
+ CFURLRef thesoundURL = (__bridge CFURLRef) [NSURL fileURLWithPath:path] ;
|
|
|
+ AudioServicesCreateSystemSoundID(thesoundURL, &sameViewSoundID);
|
|
|
+ //变量SoundID与URL对应
|
|
|
+ DebugLog(@"%u",(unsigned int)sameViewSoundID);
|
|
|
+ AudioServicesPlaySystemSound(1112); //播放SoundID声音
|
|
|
+
|
|
|
+
|
|
|
+ */
|
|
|
+ CFBundleRef mainBundle;
|
|
|
+ SystemSoundID soundFileObject;
|
|
|
+ mainBundle = CFBundleGetMainBundle ();
|
|
|
+ CFURLRef soundFileURLRef = CFBundleCopyResourceURL (
|
|
|
+ mainBundle,
|
|
|
+ CFSTR ("softScanBeep" ),
|
|
|
+ CFSTR ("wav" ),
|
|
|
+ NULL
|
|
|
+ );
|
|
|
+ AudioServicesCreateSystemSoundID (
|
|
|
+ soundFileURLRef,
|
|
|
+ &soundFileObject
|
|
|
+ );
|
|
|
+ AudioServicesPlaySystemSound(soundFileObject);
|
|
|
+}
|
|
|
+- (void)viewWillAppear:(BOOL)animated
|
|
|
+{
|
|
|
+ [super viewWillAppear:animated];
|
|
|
+ [[self navigationController] setNavigationBarHidden:NO animated:NO];
|
|
|
+
|
|
|
+
|
|
|
+ //
|
|
|
+ //[ attemptRotationToDeviceOrientation];
|
|
|
+
|
|
|
+ //[UIViewController attemptRotationToDeviceOrientation];
|
|
|
+
|
|
|
+//
|
|
|
+// [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
|
|
|
+// self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
|
|
|
+// CGRect frame = [UIScreen mainScreen].applicationFrame;
|
|
|
+// self.view.bounds = CGRectMake(0, 0, 768, 1024);
|
|
|
+}
|
|
|
+
|
|
|
+- (void)onBackClick:(UIButton *)sender {
|
|
|
+
|
|
|
+
|
|
|
+ [self.navigationController popViewControllerAnimated:FALSE];
|
|
|
+}
|
|
|
+- (void)viewDidLoad
|
|
|
+{
|
|
|
+ [super viewDidLoad];
|
|
|
+ UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"back"] imageWithRenderingMode:UIImageRenderingModeAutomatic]
|
|
|
+ style:UIBarButtonItemStylePlain
|
|
|
+ target:self
|
|
|
+ action:@selector( onBackClick:)];
|
|
|
+
|
|
|
+ // closeButton.tintColor = UIColorFromRGB(0x996633);
|
|
|
+
|
|
|
+ self.navigationItem.leftBarButtonItem = closeButton;
|
|
|
+
|
|
|
+ // return;
|
|
|
+ [self.backgroundView removeFromSuperview];
|
|
|
+ //self.back = (ScannerControllerView*)self.view;
|
|
|
+ self.backgroundView.highLightRect = CGRectInset(self.focusZone.frame,6,6);
|
|
|
+ // self.backgroundView.autoresizingMask=0xff;
|
|
|
+ self.handelOutput = false;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // self.ScannerControl =[self.storyboard instantiateViewControllerWithIdentifier:@"ScannerControlViewController"];
|
|
|
+ // self.ScannerControl.Scannerdelegate = self;
|
|
|
+
|
|
|
+ // self.view.layer.
|
|
|
+
|
|
|
+ // Do any additional setup after loading the view, typically from a nib.
|
|
|
+
|
|
|
+ // Create a new AVCaptureSession
|
|
|
+ AVCaptureSession *session = [[AVCaptureSession alloc] init];
|
|
|
+
|
|
|
+ session.sessionPreset = AVCaptureSessionPresetHigh;
|
|
|
+
|
|
|
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
|
|
|
+
|
|
|
+ // float factor = device.videoZoomFactor;
|
|
|
+ // float up = device.activeFormat.videoZoomFactorUpscaleThreshold;
|
|
|
+ // [device lockForConfiguration:nil];
|
|
|
+ // device.videoZoomFactor = device.activeFormat.videoZoomFactorUpscaleThreshold;
|
|
|
+ // [device unlockForConfiguration];
|
|
|
+ NSError *error = nil;
|
|
|
+
|
|
|
+ // Want the normal device
|
|
|
+ AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
|
|
|
+
|
|
|
+ if(input) {
|
|
|
+ // Add the input to the session
|
|
|
+ [session addInput:input];
|
|
|
+
|
|
|
+ } else {
|
|
|
+ DebugLog(@"error: %@", error);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
|
|
|
+ // Have to add the output before setting metadata types
|
|
|
+ [session addOutput:output];
|
|
|
+ // What different things can we register to recognise?
|
|
|
+ DebugLog(@"%@", [output availableMetadataObjectTypes]);
|
|
|
+ // We're only interested in QR Codes
|
|
|
+ [output setMetadataObjectTypes:@[AVMetadataObjectTypeUPCECode,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode39Mod43Code,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode93Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeQRCode,AVMetadataObjectTypeAztecCode]];
|
|
|
+ DebugLog(@"%@", [output metadataObjectTypes]);
|
|
|
+ // NSArray* supporttype=output.availableMetadataObjectTypes;
|
|
|
+ // [output setMetadataObjectTypes:output.availableMetadataObjectTypes];
|
|
|
+ // This VC is the delegate. Please call us on the main queue
|
|
|
+ [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
|
|
|
+ //
|
|
|
+ // CGRect rt1 = self.ScannerControl.scannerZone.frame;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // Display on screen
|
|
|
+ _previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
|
|
|
+ _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
|
|
|
+
|
|
|
+// _previewLayer.orientation= AVCaptureVideoOrientationLandscapeRight;
|
|
|
+ UIInterfaceOrientation orientation = [[UIApplication sharedApplication]statusBarOrientation];
|
|
|
+ switch (orientation) {
|
|
|
+
|
|
|
+// UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
|
|
|
+// UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
|
|
|
+// UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
|
|
|
+// UIInterfaceOrientationLandscapeRight
|
|
|
+
|
|
|
+
|
|
|
+// AVCaptureVideoOrientationPortrait = 1,
|
|
|
+// AVCaptureVideoOrientationPortraitUpsideDown = 2,
|
|
|
+// AVCaptureVideoOrientationLandscapeRight = 3,
|
|
|
+// AVCaptureVideoOrientationLandscapeLeft = 4,
|
|
|
+ case UIInterfaceOrientationPortrait:
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationPortrait;
|
|
|
+ break;
|
|
|
+ case UIInterfaceOrientationPortraitUpsideDown:
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationPortraitUpsideDown;
|
|
|
+ break;
|
|
|
+ case UIInterfaceOrientationLandscapeLeft:
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationLandscapeLeft;
|
|
|
+ break;
|
|
|
+ case UIInterfaceOrientationLandscapeRight:
|
|
|
+ _previewLayer.connection.videoOrientation=AVCaptureVideoOrientationLandscapeRight;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ CGRect rect=self.view.bounds;
|
|
|
+ // rect.origin.y=rect.origin.y+40;
|
|
|
+ // rect.size.height = rect.size.height-40;
|
|
|
+
|
|
|
+ _previewLayer.bounds = rect;
|
|
|
+ _previewLayer.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));
|
|
|
+ [self.view.layer addSublayer:_previewLayer];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ [self.view addSubview:self.backgroundView];
|
|
|
+
|
|
|
+ // [self.view addSubview:self.ScannerControl.view];
|
|
|
+ // CGRect rt = self.ScannerControl.scannerZone.bounds;
|
|
|
+
|
|
|
+ // CGRect rt1 =output.rectOfInterest;
|
|
|
+ // output.rectOfInterest = CGRectMake(0, 0, 300, 300); //self.ScannerControl.scannerZone.frame;
|
|
|
+ // ScannerControllerView* view =[[ ScannerControllerView alloc] initWithFrame:self.view.frame];
|
|
|
+ // view.backgroundColor = [UIColor clearColor];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // ScannerLayer * layer = [[ScannerLayer alloc] init];
|
|
|
+ // [self.view.layer addSublayer:layer];
|
|
|
+
|
|
|
+
|
|
|
+ // Add the view to draw the bounding box for the UIView
|
|
|
+ _boundingBox = [[SCShapeView alloc] initWithFrame:self.view.bounds];
|
|
|
+ _boundingBox.backgroundColor = [UIColor clearColor];
|
|
|
+ _boundingBox.hidden = YES;
|
|
|
+ [self.view addSubview:_boundingBox];
|
|
|
+
|
|
|
+ // Add a label to display the resultant message
|
|
|
+ _decodedMessage = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(self.view.bounds) - 75, CGRectGetWidth(self.view.bounds), 75)];
|
|
|
+ _decodedMessage.numberOfLines = 0;
|
|
|
+ _decodedMessage.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.9];
|
|
|
+ _decodedMessage.textColor = [UIColor darkGrayColor];
|
|
|
+ _decodedMessage.textAlignment = NSTextAlignmentCenter;
|
|
|
+ [self.view addSubview:_decodedMessage];
|
|
|
+
|
|
|
+ self.scanButton.layer.shadowColor = [UIColor blackColor].CGColor;
|
|
|
+ self.scanButton.layer.shadowOffset = CGSizeMake(0, 0);
|
|
|
+ self.scanButton.layer.shadowOpacity = 0.5;
|
|
|
+ self.scanButton.layer.shadowRadius = 2.0;
|
|
|
+ self.scanButton.layer.borderColor = [[UIColor darkGrayColor] CGColor];
|
|
|
+ self.scanButton.layer.borderWidth = 15;
|
|
|
+ // Start the AVSession running
|
|
|
+ [session startRunning];
|
|
|
+}
|
|
|
+//#pragma mark - ScannerControllerDelegate
|
|
|
+//-(void)BeginScan:(bool)begin
|
|
|
+//{
|
|
|
+// self.handelOutput = begin;
|
|
|
+//}
|
|
|
+#pragma mark - AVCaptureMetadataOutputObjectsDelegate
|
|
|
+- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
|
|
|
+{
|
|
|
+ if(!self.handelOutput)
|
|
|
+ return;
|
|
|
+ AVMetadataObject * cadedate = nil;
|
|
|
+ CGPoint centerzone =CGPointMake(CGRectGetMidX(self.focusZone.frame), CGRectGetMidY(self.focusZone.frame));
|
|
|
+
|
|
|
+ float distance = MAXFLOAT;
|
|
|
+ for (AVMetadataObject *metadata in metadataObjects) {
|
|
|
+ DebugLog(@"%@",metadata);
|
|
|
+ // if ([metadata.type isEqualToString:AVMetadataObjectTypeQRCode])
|
|
|
+ {
|
|
|
+ // Transform the meta-data coordinates to screen coords
|
|
|
+ AVMetadataMachineReadableCodeObject *transformed = (AVMetadataMachineReadableCodeObject *)[_previewLayer transformedMetadataObjectForMetadataObject:metadata];
|
|
|
+ // Update the frame on the _boundingBox view, and show it
|
|
|
+ CGRect rt = transformed.bounds;
|
|
|
+
|
|
|
+ CGRectGetMidX(rt);
|
|
|
+ CGPoint centermeta =CGPointMake(CGRectGetMidX(rt), CGRectGetMidY(rt));
|
|
|
+ if(CGRectContainsPoint(self.focusZone.frame, centermeta))
|
|
|
+ {
|
|
|
+ if(cadedate == nil)
|
|
|
+ cadedate = metadata;
|
|
|
+ float distancemeta = (centermeta.x-centerzone.x)*(centermeta.x-centerzone.x)+(centermeta.y-centerzone.y)*(centermeta.y-centerzone.y);
|
|
|
+ if(distancemeta<distance)
|
|
|
+ {
|
|
|
+ distance = distancemeta;
|
|
|
+ cadedate = metadata;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(cadedate==nil)
|
|
|
+ return;
|
|
|
+ AVMetadataMachineReadableCodeObject *transformed = (AVMetadataMachineReadableCodeObject *)[_previewLayer transformedMetadataObjectForMetadataObject:cadedate];
|
|
|
+ // Update the frame on the _boundingBox view, and show it
|
|
|
+ // CGRect rt = transformed.bounds;
|
|
|
+ _boundingBox.frame = transformed.bounds;
|
|
|
+ _boundingBox.hidden = NO;
|
|
|
+ // Now convert the corners array into CGPoints in the coordinate system
|
|
|
+ // of the bounding box itself
|
|
|
+
|
|
|
+ // NSArray * corners = transformed.corners;
|
|
|
+ NSArray *translatedCorners = [self translatePoints:transformed.corners
|
|
|
+ fromView:self.view
|
|
|
+ toView:_boundingBox];
|
|
|
+
|
|
|
+ // Set the corners array
|
|
|
+ _boundingBox.corners = translatedCorners;
|
|
|
+
|
|
|
+ // Update the view with the decoded text
|
|
|
+ _decodedMessage.text = [transformed stringValue];
|
|
|
+
|
|
|
+ // Start the timer which will hide the overlay
|
|
|
+ [self startOverlayHideTimer];
|
|
|
+ [self playSound];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ self.handelOutput = false;
|
|
|
+ [self StopScan];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ self.scan_val = [transformed stringValue];
|
|
|
+
|
|
|
+ [self dismissViewControllerAnimated:false completion:^{
|
|
|
+ if(self.returnCode)
|
|
|
+ self.returnCode(self.scan_val);
|
|
|
+ }];
|
|
|
+
|
|
|
+
|
|
|
+// switch (self.target) {
|
|
|
+// case SCANNER_TARGET_DETAIL:
|
|
|
+// {
|
|
|
+// DetailViewController* dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController" ];
|
|
|
+// // dvc
|
|
|
+//
|
|
|
+//
|
|
|
+// dvc.use_model_name = true;
|
|
|
+// dvc.model_name=[transformed stringValue];
|
|
|
+// dvc.category_id=nil;
|
|
|
+// dvc.ispush = true;
|
|
|
+//
|
|
|
+// [dvc reload];
|
|
|
+// [self.navigationController pushViewController:dvc animated:true];
|
|
|
+// }
|
|
|
+// break;
|
|
|
+// case SCANNER_TARGET_CART:
|
|
|
+// {
|
|
|
+//
|
|
|
+//
|
|
|
+// [CartUtils add_to_cart:self selectorholder:self selector:@selector(addtocart)];
|
|
|
+//// return;
|
|
|
+//// [self add_toCart];
|
|
|
+// // DetailViewController* dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController" ];
|
|
|
+// // // dvc
|
|
|
+// //
|
|
|
+// //
|
|
|
+// // dvc.use_model_name = true;
|
|
|
+// // dvc.model_name=[transformed stringValue];
|
|
|
+// // dvc.category_id=nil;
|
|
|
+// // dvc.ispush = true;
|
|
|
+// //
|
|
|
+// // [dvc reload];
|
|
|
+// // [self.navigationController pushViewController:dvc animated:true];
|
|
|
+// }
|
|
|
+// break;
|
|
|
+// default:
|
|
|
+// break;
|
|
|
+// }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+//-(void)add_toCart
|
|
|
+//{
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// UIApplication * app = [UIApplication sharedApplication];
|
|
|
+// AppDelegate *appDelegate = (AppDelegate *)[app delegate];
|
|
|
+// MainViewController* main_vc=(MainViewController*)appDelegate.main_vc;
|
|
|
+// if(appDelegate.bLogin==false)
|
|
|
+// {
|
|
|
+// LoginViewController * loginvc =[ self.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
|
|
|
+//
|
|
|
+//
|
|
|
+// loginvc.returnValue = ^(bool blogin){
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// if(blogin)
|
|
|
+// {
|
|
|
+// if(/*appDelegate.user_type==USER_ROLE_EMPLOYEE*/ true)
|
|
|
+// {
|
|
|
+// [((MainViewController*)appDelegate.main_vc) reloadCategory:true immediately:false];
|
|
|
+// [main_vc checklogin:false];
|
|
|
+// UIAlertView * alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Add to cart", nil) message:NSLocalizedString(@"Do you want to add to pending a order or a new order", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", nil) otherButtonTitles:NSLocalizedString(@"Add to pending order", nil),NSLocalizedString(@"Add to new order", nil), nil];
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// // alert.
|
|
|
+// [alert show];
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// [main_vc checklogin:true];
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// };
|
|
|
+//
|
|
|
+// UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:loginvc] ;
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// // [self hackModalSheetSize:CGSizeMake(450, 200) ofVC:navi];
|
|
|
+//
|
|
|
+// navi.modalPresentationStyle = UIModalTransitionStyleCrossDissolve;//有三种状态,自己看看是哪种
|
|
|
+// [self presentViewController:navi animated:YES completion:^{
|
|
|
+//
|
|
|
+// // navi.view.superview.bounds = CGRectMake(0, 0, 480, 320);
|
|
|
+//
|
|
|
+// DebugLog(@"LoginViewController present.........");
|
|
|
+//
|
|
|
+// // self.btop = false;
|
|
|
+// // <#code#>
|
|
|
+// }];
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+//
|
|
|
+//
|
|
|
+// if(/*appDelegate.user_type==USER_ROLE_EMPLOYEE&&/*appDelegate.contact_id==nil&&*/appDelegate.order_code==nil)
|
|
|
+// {
|
|
|
+// [main_vc checklogin:false];
|
|
|
+//
|
|
|
+// if(appDelegate.can_create_order)
|
|
|
+// {
|
|
|
+// NSString* msg =@"";
|
|
|
+// if(appDelegate.contact_id.length>0)
|
|
|
+// {
|
|
|
+// msg = [msg stringByAppendingString:@"\n\nCustomer:"];
|
|
|
+// msg = [msg stringByAppendingString:appDelegate.customerInfo[@"customer_name"]];
|
|
|
+//
|
|
|
+// }
|
|
|
+// UIAlertView * alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Add to cart", nil) message:msg delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", nil) otherButtonTitles:NSLocalizedString(@"Add to pending order", nil),NSLocalizedString(@"Add to new order", nil), nil];
|
|
|
+//
|
|
|
+// // alert.
|
|
|
+// [alert show];
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// UIAlertView * alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Add to cart", nil) message:NSLocalizedString(@"", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", nil) otherButtonTitles:NSLocalizedString(@"Add to pending order", nil), nil];
|
|
|
+//
|
|
|
+// // alert.
|
|
|
+// [alert show];
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+//
|
|
|
+//
|
|
|
+// if(appDelegate.order_code==nil)
|
|
|
+// [ self neworder];
|
|
|
+// else
|
|
|
+// [self addtocart];
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+//-(void) neworder
|
|
|
+//{
|
|
|
+//
|
|
|
+// UIAlertView * waitalert = [RAUtils waiting_alert:@"Please wait" title:@"Create Order"];
|
|
|
+// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
|
+//
|
|
|
+// NSDictionary* return_json = [iSalesNetwork new_Order];
|
|
|
+//
|
|
|
+// dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
+// [waitalert dismissWithClickedButtonIndex:0 animated:FALSE];
|
|
|
+//
|
|
|
+//
|
|
|
+// if([[return_json valueForKey:@"result"] intValue]==2)
|
|
|
+// {
|
|
|
+// int result=[[return_json valueForKey:@"result"] intValue];
|
|
|
+// if(result==2)
|
|
|
+// {
|
|
|
+// //successed.
|
|
|
+//
|
|
|
+// NSString* order_code = [return_json valueForKey:@"orderCode"];
|
|
|
+// AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
|
|
|
+// appDelegate.order_code = order_code;
|
|
|
+// appDelegate.order_status = [[return_json valueForKey:@"orderStatus"] intValue];
|
|
|
+//
|
|
|
+//
|
|
|
+// [self addtocart];
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+//
|
|
|
+// [RAUtils message_alert:[return_json valueForKey:@"err_msg"] title:@"Add To Cart" controller:self] ;
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// });
|
|
|
+// });
|
|
|
+//}
|
|
|
+//-(void) addtocart
|
|
|
+//{
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
|
+//
|
|
|
+// NSDictionary* return_json = [iSalesNetwork add_toCart_byName: self.scan_val];
|
|
|
+//
|
|
|
+// dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// if([[return_json valueForKey:@"result"] intValue]==2)
|
|
|
+// {
|
|
|
+//
|
|
|
+//
|
|
|
+// AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
|
|
|
+//
|
|
|
+// [((MainViewController*)appDelegate.main_vc) reloadCart:true immediately:false];
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+//
|
|
|
+// [RAUtils message_alert:[return_json valueForKey:@"err_msg"] title:@"Add To Cart" controller:self] ;
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// });
|
|
|
+// });
|
|
|
+//
|
|
|
+//
|
|
|
+//}
|
|
|
+//- (IBAction)TargetButtonClick:(id)sender {
|
|
|
+//
|
|
|
+// UIAlertController *alertControl = [UIAlertController alertControllerWithTitle:@"Change scanner target to" message:nil preferredStyle:UIAlertControllerStyleAlert];
|
|
|
+// //block代码块取代了delegate
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// UIAlertAction *actionOne = [UIAlertAction actionWithTitle:@"Model Detail" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
|
|
|
+//
|
|
|
+// [self.targetButton setTitle:@"Target: Model Detail" forState:UIControlStateNormal];
|
|
|
+//
|
|
|
+// self.target = SCANNER_TARGET_DETAIL;
|
|
|
+// // UIAlertView * waitalert = [RAUtils waiting_alert:@"Please wait..." title:@"Remove Models From Cart"];
|
|
|
+// // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
|
+// //
|
|
|
+// // NSDictionary* cart_json = [iSalesNetwork cart_remove:ids];
|
|
|
+// //
|
|
|
+// // dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
+// //
|
|
|
+// // [waitalert dismissWithClickedButtonIndex:0 animated:FALSE];
|
|
|
+// //
|
|
|
+// // if([[cart_json valueForKey:@"result"] intValue]==2)
|
|
|
+// // {
|
|
|
+// //
|
|
|
+// // [self end_edit];
|
|
|
+// // AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
|
|
|
+// // [((MainViewController*)appDelegate.main_vc) reloadCart:true immediately:true];
|
|
|
+// // [((MainViewController*)appDelegate.main_vc) reloadCategory:true immediately:true];
|
|
|
+// // }
|
|
|
+// // else
|
|
|
+// // {
|
|
|
+// // [RAUtils message_alert:[cart_json valueForKey:@"err_msg"] title:@"Delete Model" controller:self] ;
|
|
|
+// // }
|
|
|
+// //
|
|
|
+// //
|
|
|
+// //
|
|
|
+// // });
|
|
|
+// // });
|
|
|
+//
|
|
|
+//
|
|
|
+// }];
|
|
|
+//
|
|
|
+// UIAlertAction *alertthree = [UIAlertAction actionWithTitle:@"Cart" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
|
|
|
+//
|
|
|
+//
|
|
|
+// [self.targetButton setTitle:@"Target: Cart" forState:UIControlStateNormal];
|
|
|
+// self.target = SCANNER_TARGET_CART;
|
|
|
+//
|
|
|
+// DebugLog(@"No");
|
|
|
+// }];
|
|
|
+// [alertControl addAction:actionOne];
|
|
|
+//
|
|
|
+// [alertControl addAction:alertthree];
|
|
|
+//
|
|
|
+// //UIAlertControllerStyle类型为UIAlertControllerStyleAlert可以添加addTextFieldWithConfigurationHandler:^(UITextField *textField)
|
|
|
+//
|
|
|
+//
|
|
|
+// [self presentViewController:alertControl animated:YES completion:nil];
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//}
|
|
|
+- (IBAction)ScanButtonClick:(id)sender {
|
|
|
+ self.scanButton.backgroundColor = [UIColor greenColor];
|
|
|
+
|
|
|
+
|
|
|
+ [self.scanButton setTitle:@"Scanning" forState:UIControlStateNormal];
|
|
|
+// self.scanButton.layer.borderWidth = 1;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ self.handelOutput = true;
|
|
|
+
|
|
|
+ // if (self.Scannerdelegate && [self.Scannerdelegate respondsToSelector:@selector(BeginScan:)]) {
|
|
|
+ // [self.Scannerdelegate BeginScan:true];
|
|
|
+ // }
|
|
|
+}
|
|
|
+-(void) StopScan
|
|
|
+{
|
|
|
+ self.scanButton.backgroundColor = [UIColor redColor];
|
|
|
+ [self.scanButton setTitle:@"Tap" forState:UIControlStateNormal];
|
|
|
+}
|
|
|
+
|
|
|
+#pragma mark - Utility Methods
|
|
|
+- (void)startOverlayHideTimer
|
|
|
+{
|
|
|
+ // Cancel it if we're already running
|
|
|
+ if(_boxHideTimer) {
|
|
|
+ [_boxHideTimer invalidate];
|
|
|
+ }
|
|
|
+
|
|
|
+ // Restart it to hide the overlay when it fires
|
|
|
+ _boxHideTimer = [NSTimer scheduledTimerWithTimeInterval:0.2
|
|
|
+ target:self
|
|
|
+ selector:@selector(removeBoundingBox:)
|
|
|
+ userInfo:nil
|
|
|
+ repeats:NO];
|
|
|
+}
|
|
|
+
|
|
|
+- (void)removeBoundingBox:(id)sender
|
|
|
+{
|
|
|
+ // Hide the box and remove the decoded text
|
|
|
+ _boundingBox.hidden = YES;
|
|
|
+ // _decodedMessage.text = @"";
|
|
|
+}
|
|
|
+
|
|
|
+- (NSArray *)translatePoints:(NSArray *)points fromView:(UIView *)fromView toView:(UIView *)toView
|
|
|
+{
|
|
|
+ NSMutableArray *translatedPoints = [NSMutableArray new];
|
|
|
+
|
|
|
+ // The points are provided in a dictionary with keys X and Y
|
|
|
+ for (NSDictionary *point in points) {
|
|
|
+ // Let's turn them into CGPoints
|
|
|
+ CGPoint pointValue = CGPointMake([point[@"X"] floatValue], [point[@"Y"] floatValue]);
|
|
|
+ // Now translate from one view to the other
|
|
|
+ CGPoint translatedPoint = [fromView convertPoint:pointValue toView:toView];
|
|
|
+ // Box them up and add to the array
|
|
|
+ [translatedPoints addObject:[NSValue valueWithCGPoint:translatedPoint]];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [translatedPoints copy];
|
|
|
+}
|
|
|
+
|
|
|
+//#pragma mark - UIAlertViewDelegate
|
|
|
+//// Called when a button is clicked. The view will be automatically dismissed after this call returns
|
|
|
+//- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
|
|
|
+//{
|
|
|
+// UIApplication * app = [UIApplication sharedApplication];
|
|
|
+// AppDelegate *appDelegate = (AppDelegate *)[app delegate];
|
|
|
+//
|
|
|
+//
|
|
|
+// // int count=[self.quantity_text.text intValue];
|
|
|
+//
|
|
|
+// MainViewController* main_vc=(MainViewController*)appDelegate.main_vc;
|
|
|
+// if(buttonIndex==alertView.cancelButtonIndex)
|
|
|
+// {
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+// else if(buttonIndex==1)
|
|
|
+// {
|
|
|
+// //open exist
|
|
|
+// OrderListViewController* ovc =[ self.storyboard instantiateViewControllerWithIdentifier:@"OrderListViewController"];
|
|
|
+// ovc.showNavibar = true;
|
|
|
+// ovc.selectOrder = ^(NSMutableDictionary* order_detail){
|
|
|
+// if(appDelegate.order_code==nil)
|
|
|
+// {
|
|
|
+// [self neworder];
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// [((MainViewController*)appDelegate.main_vc) reloadCart:true immediately:false];
|
|
|
+//
|
|
|
+//
|
|
|
+// [self addtocart];
|
|
|
+// [main_vc checklogin:true];
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+// };
|
|
|
+// ovc.init_style = OL_OPEN;
|
|
|
+// ovc.onCancel = ^(){
|
|
|
+//
|
|
|
+// [main_vc checklogin:true];
|
|
|
+//
|
|
|
+// };
|
|
|
+//
|
|
|
+// [self.navigationController pushViewController:ovc animated:true];
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// //create new;
|
|
|
+// if(appDelegate.customerInfo==nil)// select contact if current contact not exist
|
|
|
+// {
|
|
|
+//
|
|
|
+//
|
|
|
+// ContactListViewController* cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"ContactListViewController" ];
|
|
|
+// cvc.showNavibar = true;
|
|
|
+// cvc.contact_type = @"Sales_Order_Customer";
|
|
|
+// cvc.returnValue = ^(NSMutableDictionary* value,NSIndexPath* source){
|
|
|
+//
|
|
|
+// appDelegate.contact_id=[value valueForKey:@"customer_cid"];
|
|
|
+// appDelegate.customerInfo = value;
|
|
|
+//
|
|
|
+//
|
|
|
+// if(appDelegate.order_code==nil)
|
|
|
+// [self neworder];
|
|
|
+//
|
|
|
+// [main_vc checklogin:true];
|
|
|
+// // [self handle_action_return:value indexPath:indexPath action:ACTION_FILL_SECTION];
|
|
|
+//
|
|
|
+// //
|
|
|
+// // if(self.returnValue)
|
|
|
+// // self.returnValue(value);
|
|
|
+// };
|
|
|
+//
|
|
|
+// cvc.onCancel = ^(){
|
|
|
+//
|
|
|
+// UIViewController *vc= [RAUtils getViewController:self];
|
|
|
+// [RAUtils message_alert:@"Cannot create order without cursomer infomation." title:@"New Order" controller:vc];
|
|
|
+//
|
|
|
+// };
|
|
|
+// cvc.onReset = ^(){
|
|
|
+// [main_vc checklogin:true];
|
|
|
+// };
|
|
|
+//
|
|
|
+// [self.navigationController pushViewController:cvc animated:true];
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// [self neworder];
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+//}
|
|
|
+@end
|