• iOS7+ 扫描二维码和条形码实现 耗时操作


      iOS7以前都是用Zxing Zbar 来实现 扫描二维码以及条形码,从iOS7 出来后,系统自带API很强大,渐渐也就放弃了Zxing Zbar的使用,

    直接上主要代码:

    - (void)setupCamera
    
    {
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
            [HUDUtils showHUDProgress:@""];
    
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    
            if (authStatus == AVAuthorizationStatusAuthorized) {//已经授权
    
            
    
            }else { //没有授权
    
                NSString *recommand;
    
                if (IS_IOS_8) {
    
                    recommand = @"无法打开相机,请去设置中打开后继续操作
    设置->好点商家->相机";
    
                }else{
    
                    recommand = @"无法打开相机,请去设置中打开后继续操作
    设置->隐私->相机->好点商家";
    
                
    
                }
    
     
    
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:recommand delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
    
                [alert show];
    
                return;
    
                
    
            }
    
        
    
            /// Device
    
            _device  = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
        
    
        
    
            // Input
    
            _input   = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
    
        
    
            // Output
    
            _output  = [[AVCaptureMetadataOutput alloc] init];
    
            [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
            _output.rectOfInterest = self.scanImageView.bounds;
    
        
    
            // Session
    
            _session = [[AVCaptureSession alloc]init];
    
            [_session setSessionPreset:AVCaptureSessionPresetHigh];
    
            if ([_session canAddInput:self.input])
    
            {
    
                [_session addInput:self.input];
    
            }
    
        
    
            if ([_session canAddOutput:self.output])
    
            {
    
                [_session addOutput:self.output];
    
            }
    
        
    
            // 条码类型 AVMetadataObjectTypeQRCode
    
            _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeUPCECode];
    
        
    
        dispatch_async(dispatch_get_main_queue(), ^{
    
        // Preview
    
            [HUDUtils dismiss];
    
            _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
    
            _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    
            _preview.frame        = self.view.frame;
    
            [self.view.layer insertSublayer:self.preview atIndex:0];
    
        
    
            /* 配置取景框之外颜色开始 */
    
            // scanCrop
    
            UIView *viewTopScan =
    
            [[UIView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, self.scanImageView.top)];
    
        
    
            UIView *viewBottomScan =
    
            [[UIView alloc] initWithFrame:CGRectMake(0, self.scanImageView.bottom,
    
                                                 ScreenWidth,
    
                                                 ScreenHeight - self.scanImageView.bottom)];
    
        
    
            UIView *viewLeftScan =
    
            [[UIView alloc] initWithFrame:CGRectMake(0, self.scanImageView.top, (ScreenWidth-self.scanImageView.width)/2, self.scanImageView.height)];
    
        
    
            UIView *viewRightScan =
    
            [[UIView alloc] initWithFrame:CGRectMake(self.scanImageView.right,
    
                                                 self.scanImageView.top,
    
                                                 (ScreenWidth-self.scanImageView.width)/2,
    
                                                 self.scanImageView.height)];
    
            viewTopScan.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2];
    
            viewBottomScan.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2];
    
            viewLeftScan.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2];
    
            viewRightScan.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2];
    
            [self.view addSubview:viewTopScan];
    
            [self.view addSubview:viewBottomScan];
    
            [self.view addSubview:viewLeftScan];
    
            [self.view addSubview:viewRightScan];
    
        
    
            /* 配置取景框之外颜色结束 */
    
            self.contentLable.layer.cornerRadius = self.contentLable.height / 2 ;
    
            self.contentLable.layer.backgroundColor = [[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8] CGColor];
    
        
    
            // Start
    
            [_session startRunning];
    
            });
    
        });
    
    }

    有一点需要注意,在初始化相机的时候,会耗时,在iPhone 4 机器上体现的尤为明显,也很简单,加上一个异步操作解决问题.

  • 相关阅读:
    小程序 横向水平 垂直滚动
    小程序radio-group切换
    Linux系统下安装rabbitmq
    timestamp 和 datetime
    linux下部署程序,tomcat启动正常,但网页无法访问
    JSP 标签库(一)之<c:import>
    MyBaitis SQL(一)
    JSP页面url传递参数编码问题
    获取同级td的值
    解决ajax获取不到按钮的id
  • 原文地址:https://www.cnblogs.com/dachengzi/p/4670693.html
Copyright © 2020-2023  润新知