• 浅谈iOS7 AVFoundation 二维码扫描


     iOS7,AVFoundation中现在已经内置支持一维和二维码的扫瞄,iOS6及之前的想要扫瞄二维码,还是需要添加第三方库ZXing和ZBar。

    ZBar生成二维码:http://blog.csdn.net/cafei111/article/details/8924297

    先添加AVFoundation.framework


    #import <AVFoundation/AVFoundation.h>

    @interface QRcodeViewController :UIViewController<AVCaptureMetadataOutputObjectsDelegate>

    @property (strong,nonatomic)AVCaptureDevice *device;
    @property (strong,nonatomic)AVCaptureDeviceInput *input;
    @property (strong,nonatomic)AVCaptureMetadataOutput *output;
    @property (strong,nonatomic)AVCaptureSession *session;
    @property (strong,nonatomic)AVCaptureVideoPreviewLayer *preview;

    @end


    - (void)setupCamera
    {
        // Device
        self.device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
        
        // Input
        self.input = [AVCaptureDeviceInputdeviceInputWithDevice:self.deviceerror:nil];
        
        // Output
        self.output = [[AVCaptureMetadataOutputalloc]init];
        [self.outputsetMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];
        
        // Session
        self.session = [[AVCaptureSessionalloc]init];
       [self.sessionsetSessionPreset:AVCaptureSessionPresetHigh];
       if ([self.sessioncanAddInput:self.input])
        {
            [self.sessionaddInput:self.input];
        }
       if ([self.sessioncanAddOutput:self.output])
        {
            [self.sessionaddOutput:self.output];
        }
        
        // 条码类型
        self.output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];
        
        // Preview
        self.preview = [AVCaptureVideoPreviewLayerlayerWithSession:self.session];
        self.preview.videoGravity =AVLayerVideoGravityResizeAspectFill;
        self.preview.frame =CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
       [self.view.layeraddSublayer:self.preview];
        
        // Start
        [self.sessionstartRunning];
    }

    条码类型有如下几种:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    AVMetadataObjectTypeUPCECode
    AVMetadataObjectTypeCode39Code
    AVMetadataObjectTypeCode39Mod43Code
    AVMetadataObjectTypeEAN13Code
    AVMetadataObjectTypeEAN8Code
    AVMetadataObjectTypeCode93Code
    AVMetadataObjectTypeCode128Code
    AVMetadataObjectTypePDF417Code
    AVMetadataObjectTypeQRCode
    AVMetadataObjectTypeAztecCode

    扫瞄到二维码之后,会调用delegate

    #pragma mark AVCaptureMetadataOutputObjectsDelegate
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
       NSString *stringValue;
        
       if ([metadataObjectscount] >0) {
           AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjectsobjectAtIndex:0];
            stringValue = metadataObject.stringValue;
        }
        
        [_sessionstopRunning];
        
        [selfdismissViewControllerAnimated:YEScompletion:^{
           UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:nil
                                                           message:stringValue
                                                          delegate:nil
                                                 cancelButtonTitle:@"OK"
                                                 otherButtonTitles:nil,nil];
            [alertshow];
        }];
    }


    这个委托方法里面的字符串stringValue就是二维码的内容

  • 相关阅读:
    WINDOWS 远程桌面不能直接拷贝文件问题
    Spring的xml文件详解
    xml名称空间详解
    markdown基本语法
    web.xml文件详解
    Spring事务的7中传播行为
    docker修改容器配置文件
    Load balancer does not have available server for client: CLOUD-PROVIDER-HYSTRIX-PAYMENT
    layui导出表格的两种方法
    解决:Error:java: 无效的源发行版: 12
  • 原文地址:https://www.cnblogs.com/WLL-Hero/p/3720331.html
Copyright © 2020-2023  润新知