很简单,直接代码交流不说废话,上代码
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
@property(nonatomic,weak) AVCaptureSession *session;
@property(nonatomic,weak) AVCaptureVideoPreviewLayer *layer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//1 创建捕捉会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
self.session = session;
//2 添加输入设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[self.session addInput:input];
//3 添加输出设备
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[self.session addOutput:output];
//设置扫描到的类型为二维码
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//4 添加到扫描图层
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;
//5 开始扫描
[self.session startRunning];
}
#pragma mark 代理的回调方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
if (metadataObjects.count > 0) {
NSLog(@"扫描到数据");
//获取扫描结果
AVMetadataMachineReadableCodeObject *object =metadataObjects.lastObject;
NSLog(@"%@",object.stringValue);
//停止扫描
[self.session stopRunning];
//移除图层
[self.layer removeFromSuperlayer];
}else {
NSLog(@"没扫描到数据");
}
}