博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 自带二维码扫描功能的实现
阅读量:4678 次
发布时间:2019-06-09

本文共 2185 字,大约阅读时间需要 7 分钟。

#自从iOS7以后中新增了二维码扫描功能。因此可以在不借助第三方类库的情况下简单的写出二维码的扫描功能;

原生的二维码扫描功能在AVFoundation框架下,所以在使用原生的二维码扫描功能时要先导入AVFoundation框架;

然后添加以下属性:

<pre><code>@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;</code></pre>

下面是对上面属性的实例化:

self.device  = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    self.input   = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

    self.output  = [[AVCaptureMetadataOutput alloc] init];

    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

     self.session = [[AVCaptureSession alloc] init];

    [self.session setSessionPreset:AVCaptureSessionPresetHigh];

     if ([self.session canAddInput:self.input])

    {

        [self.session addInput:self.input];

    }

    if ([self.session canAddOutput:self.output])

    {

        [self.session addOutput:self.output];

    }

    // 扫码类型

    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];

    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

    self.preview.frame = self.view.layer.bounds;

    [self.view.layer insertSublayer:self.preview atIndex:0];

     [self.session startRunning];

 

这儿是扫码成功之后调用的代理方法

#pragma mark AVCaptureMetadataOutputObjectsDelegate

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

    NSString *stringValue;

    if ([metadataObjects count] >0)

    {

        //停止扫描

        [_session stopRunning];

        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];

        stringValue = metadataObject.stringValue;

    }

    NSLog(@" %@",stringValue);

    // 获取到二维码的数据之后的后续操作

}

 

 以上代码基本上可以实现扫码的功能了。但是怎么样才能实现规定区域内的扫码呢?这就需要用到之间创建的属性 output ;output有一个属性

 output.rectOfInterest 专门用来设置可扫码的区域;

设置AVCaptureMetadataOutput的rectOfInterest的属性,即可扫描区域:

这样设置就可以:output.rectOfInterest = CGRectMake(y的起点/屏幕的高,x的起点/屏幕的宽,扫描的区域的高/屏幕的高,扫描的区域的宽/屏幕的宽);

 

扫描动画的实现:不在多说

 

转载于:https://www.cnblogs.com/zybdream/p/4894581.html

你可能感兴趣的文章
json针对list map set 应用
查看>>
redis配置文件详解
查看>>
Windows下更改MySQL数据库的存储位置
查看>>
docker网络模型
查看>>
vue.js组件命名
查看>>
PostGis Mapserver Openscales 环境搭建
查看>>
design pattern notes [4] - chain of responsibility, visitor
查看>>
poj 1611 The Suspects
查看>>
通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进
查看>>
ftp protocol
查看>>
sqlserver字段类型详解(转)
查看>>
PowerDesigner使用总结(转)
查看>>
VM Mac 共享文件夹一闪而过
查看>>
PAT Basic 1030
查看>>
(转)Stage3D程序的基本步骤
查看>>
68家信托公司7大派系股东分食图谱
查看>>
检查第一组博客状况
查看>>
Django--ORM相关操作
查看>>
Java中删除文件
查看>>
省选专练POI2015 Wilcze doły
查看>>