iOS Developer

iOS二维码扫描

2016-08-06  本文已影响79人  KouKuma

引用头文件:

#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;
}

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

上一篇下一篇

猜你喜欢

热点阅读