iOS二维码扫描

引用头文件:

#import <AVFoundation/AVFoundation.h>

遵守协议

<AVCaptureMetadataOutputObjectsDelegate>

定义成员变量

@property (nonatomic) AVCaptureSession *captureSession;
@property (nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer;

主要代码

//用于扫描二维码的view
UIView *qrView = [[UIView alloc] init];
qrView.frame = CGRectMake(kScreenWidth / 2 - 130, 120, 260, 400);
qrView.backgroundColor = [UIColor redColor];
[self.view addSubview:qrView];


// 获取 AVCaptureDevice 实例
NSError * error;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// 初始化输入流
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
if (!input) {
    NSLog(@"%@", [error localizedDescription]);
    return ;
}
// 创建会话
_captureSession = [[AVCaptureSession alloc] init];
// 添加输入流
[_captureSession addInput:input];
// 初始化输出流
AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
// 添加输出流
[_captureSession addOutput:captureMetadataOutput];

// 创建dispatch queue.
dispatch_queue_t dispatchQueue;
static const char *QRCodeQueueName = "QRCodeQueue";
dispatchQueue = dispatch_queue_create(QRCodeQueueName, NULL);
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
// 设置元数据类型 AVMetadataObjectTypeQRCode
[captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];

// 创建输出对象
_videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
[_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[_videoPreviewLayer setFrame:qrView.layer.bounds];
[qrView.layer addSublayer:_videoPreviewLayer];
// 开始会话
[_captureSession startRunning];

扫描结果回调

#pragma AVCaptureMetadataOutputObjectsDelegate
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects
      fromConnection:(AVCaptureConnection *)connection
{
    if (metadataObjects != nil && [metadataObjects count] > 0) {
        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
        NSString *result;
        if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
            result = metadataObj.stringValue;
            NSLog(@"二维码扫描结果是:%@",result);
        } else {
            NSLog(@"不是二维码");
        }
        
    }
}

记得最后销毁控制器的时候停止会话

- (void)dealloc
{
    // 停止会话
    [_captureSession stopRunning];
    _captureSession = nil;
}

如有错误请大家指出(╯‵□′)╯︵┻━┻

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 二维码扫描的步骤: 1、创建设备会话对象,用来设置设备数据输入 2、获取摄像头,并且将摄像头对象加入当前会话中 3...
    iosPBB阅读 653评论 0 0
  • 二维码扫描 随着时间的发展,现在越来越多的app都添加了二维码扫描的功能,最近在项目中需要使用二维码扫描功能去获取...
    Coder007阅读 424评论 0 0
  • 一、扫描 1、 ZBar ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二...
    空白Null阅读 1,099评论 0 2
  • 相信很多小伙伴都做过二维码的扫描生成,网上也有很多相关的Demo和博客从一开始的三方架构到后来用原生的都有,我之前...
    fuaiyi阅读 5,395评论 1 16
  • 项目中使用fresco作为图片加载框架,使用其中的 对头像进行圆形处理,更新了几个版本发现部分图片圆角化失败 经D...
    mrwangyong阅读 1,073评论 0 0