美文网首页
iOS 二维码扫描

iOS 二维码扫描

作者: Coder007 | 来源:发表于2016-08-12 15:12 被阅读111次

二维码扫描

随着时间的发展,现在越来越多的app都添加了二维码扫描的功能,最近在项目中需要使用二维码扫描功能去获取商品信息,所以找网上的代码研究了一下,iOS原生API是支持扫描的,但是最关键的一点就是限制扫描区域。

二维码扫描步骤
  • 创建捕捉会话
  • 添加输入设备
  • 添加输出数据
  • 设置扫描区域(这个可以省略,如果你想全屏扫描的话)
  • 设置输入元数据类型
  • 添加扫描图层
  • 开始扫面
注意:需要引入#import <AVFoundation/AVFoundation.h>
//会话和图层需要声明成属性,因为代理方法中需要使用
@property (nonatomic, weak) AVCaptureSession *session;
@property (nonatomic, weak) AVCaptureVideoPreviewLayer *layer;


// 1.创建捕捉会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
self.session = session;

// 2.添加输入设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:input];

// 3.添加输出数据
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
//设置扫描敏感区域,frame为想要扫描的敏感区域
output.rectOfInterest =[self rectOfInterestByScanViewRect:frame];

// 3.1.设置输入元数据的类型(类型是二维码数据和条形码)
output.metadataObjectTypes =@[AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode];

// 4.添加扫描图层
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;

// 5.开始扫描
[session startRunning];


- (CGRect)rectOfInterestByScanViewRect:(CGRect)rect {
    CGFloat width = CGRectGetWidth(self.view.frame);
    CGFloat height = CGRectGetHeight(self.view.frame);
    // 注意这里的x,y, w,h计算方法
    CGFloat x = rect.origin.y / height;
    CGFloat y = rect.origin.x / width;

    CGFloat w = rect.size.height / height;
    CGFloat h = rect.size.width / width;

    return CGRectMake(x, y, w, h);
}

控制器遵守协议AVCaptureMetadataOutputObjectsDelegate,实现代理方法进行监听扫描到的数据
// 当扫描到数据时就会执行该方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    if (metadataObjects.count > 0) {
        AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
        NSLog(@"%@", object.stringValue);
        // 停止扫描
        [self.session stopRunning];
        // 将预览图层移除
        [self.layer removeFromSuperlayer];
    } else {
        NSLog(@"没有扫描到数据");
    }
}

相关文章

  • iOS开发:二维码扫描与生成(扫描篇)

    iOS开发中经常要用到生成二维码与扫描二维码的功能,iOS7开始,系统支持原生的扫描二维码,iOS7 扫描二维码可...

  • ZBar

    iOS中使用ZBar扫描二维码自定义扫描界面

  • iOS开发之二维码扫描

    iOS开发之二维码扫描 在 iOS7 以前,在IOS中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar...

  • IOS中生成二维码、扫描二维码

    title : IOS中生成二维码、扫描二维码category : UI IOS中生成二维码、保存二维码 标签(空...

  • iOS二维码扫描

    前面我们已经学会了iOS二维码生成相关的知识,这篇文章主要是讲解一下iOS二维码扫描相关的知识. 二维码扫描步骤 ...

  • 二维码扫描和创建(上)

    扫描二维码(包括读取和解码) 扫描二维码OC的开源库有ZBar和ZXing。iOS7以后iOS拥有原生的扫码功能。...

  • 2019-06-03

    iOS二维码扫描//设置条码类型 ****.metadataObjectTypes =@[... - 简书

  • 详细易懂的二维码的扫描、识别与生成

    ios7之前我们实现二维码扫描是借助第三方(ZBar,ZXing等)来实现的,在ios7之后系统自己提供二维码扫描...

  • 二维码扫描

    来源 二维码扫描 ios7之前我们实现二维码扫描一般是借助第三方来实现,但是在ios7之后系统自己提供二维码扫面的...

  • iOS 二维码扫描

    iOS开发中 二维码扫描 前言 在移动开发中二维码扫描这种事情越来越常见了,在iOS中我选择了用ZBar这个第三方...

网友评论

      本文标题:iOS 二维码扫描

      本文链接:https://www.haomeiwen.com/subject/vwqesttx.html