详解iOS7原生二维码,条码扫描

本文介绍如何使用AVFoundation库实现iOS设备上的二维码扫描功能。通过设置设备输入、输出及捕获会话等,实现高效的二维码扫描,并提供了一段完整的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Demo点这https://github.com/JLHuu/ScanQRCode.git

在需要适配iOS6的时代过去后,可以不再用zxing来做二维码扫描了,AVFoundation库中,iOS7后的原生二维码扫描效率上会较以前的三方库提高很多。

首先介绍这几个类:

    AVCaptureDevice *_device; // 设备

    AVCaptureDeviceInput *_input;//设备输入

    AVCaptureMetadataOutput *_output;//输出

    AVCaptureSession *_session; // 链接

    AVCaptureVideoPreviewLayer *_preview;//展示

这几个类就可以构成二维码、条码的扫描。大家一看就明白了,贴代码

// 视频设备
    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    // torchMode 闪光灯状态,需要先调用lockForConfiguration:
    //    [_device lockForConfiguration:nil];
    //    if ([_device isTorchModeSupported:AVCaptureTorchModeOn]) {
    //        _device.torchMode = AVCaptureTorchModeOn;
    //    }
    
    _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:nil];
    _output = [[AVCaptureMetadataOutput alloc] init];
    // rectOfInterest AVCaptureMetadataOutput的属性,可以设置扫描区域,范围是rect 0~1,这个范围是相对于设备尺寸来说的,这里也就是相对于AVCaptureVideoPreviewLayer的尺寸来说的。注意:此处有坑,rect的属性是反的(x,y互换,w,h互换),具体请看http://www.tuicool.com/articles/6jUjmur
    _output.rectOfInterest = CGRectMake(.5-(200/SCREEN_HEIGHT)/2.f,.5-(200/SCREEN_WIDTH)/2.f, 200/SCREEN_HEIGHT ,200/SCREEN_WIDTH);
    // 设置输出代理
    dispatch_queue_t serialqueue = dispatch_queue_create("serialqueue", DISPATCH_QUEUE_SERIAL);
    [_output setMetadataObjectsDelegate:self queue:serialqueue];
    _session = [[AVCaptureSession alloc] init];
    if ([_session canAddInput:_input]) {
        [_session addInput:_input];
    }
    if ([_session canAddOutput:_output]) {
        [_session addOutput:_output];
    }
    
    // MetadataObjectTypes的设置一定要在session add output后设置,否者运行会crash
    /*
     二维码扫描用AVMetadataObjectTypeQRCode
     条码扫描用AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code
     关于同时能扫描二维码和条码的效率问题,请看http://www.cocoachina.com/industry/20140530/8615.html
     */
    //    [_output setMetadataObjectTypes:[NSArray arrayWithObjects:AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, nil]];
    [_output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    _preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
    // AVCaptureVideoPreviewLayer的尺寸决定输入源在video上的尺寸,如果frame放缩,则video也会相应放缩。
    _preview.frame = self.view.bounds;
    // A string defining how the video is displayed within an AVCaptureVideoPreviewLayer bounds rect.
    // 一个字符串用来定义video怎样在AVCaptureVideoPreviewLayer的尺寸下展示
    _preview.videoGravity = AVLayerVideoGravityResizeAspect;
    [self.view.layer addSublayer:_preview];

做完这些事,其实已经可以进行扫描了, rectOfInterest 这个属性是设置扫描区域的,里面有坑,具体看Demo里面的注释。最后加些扫描框框,动画什么的就大功告成了。注意条码和二维码在一块扫描会有效率的问题具体可以看看这篇文章 http://www.cocoachina.com/industry/20140530/8615.html


Demo下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值