1 #import "ViewController.h" 2 #import <AVFoundation/AVFoundation.h> 3 4 @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate> 5 6 @property (nonatomic,strong)AVCaptureSession * session; 7 @property (nonatomic,strong)AVCaptureVideoPreviewLayer * preview; 8 @end 9 10 @implementation ViewController 11 12 - (void)viewDidLoad { 13 [super viewDidLoad]; 14 self.title = @"扫一扫"; 15 [self initQrCodeScanning]; 16 // Do any additional setup after loading the view, typically from a nib. 17 } 18 - (void)initQrCodeScanning{ 19 /** 20 扫描二维码 大概的流程应该是:1.打开设备的摄像头-->2.进行二维码图像捕获-->3.获取捕获的图像进行解析-->4.取得解析结果进行后续的处理。这些流程需要用到AVFoundation这个库 21 */ 22 23 /** 24 上面完成了捕获的设置,但是并未正在开始'扫描',要完成一次扫描的过程,需要用到AVCaptureSession这个类,这个session类把一次扫描看做一次会话,会话开始后才是正在的'扫描'开始,具体代码如下。 25 */ 26 self.session = [[AVCaptureSession alloc] init]; 27 // [self.session setSessionPreset:AVCaptureSessionPresetHigh];//扫描的质量 28 //获取摄像头设备 29 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 30 NSError *error = nil; 31 //创建输入流 32 AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 33 //拍完照片以后,需要一个AVCaptureMetadataOutput对象将获取的'图像'输出,以便进行对其解析 34 AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc] init]; 35 36 if ([self.session canAddInput:input]) { 37 [self.session addInput:input]; 38 }else{ 39 //出错处理 40 NSLog(@"%@", error); 41 return; 42 } 43 if ([self.session canAddOutput:output]) { 44 [self.session addOutput:output]; 45 } 46 //设置输出类型 有二维码 条形码等 47 output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode //二维码 48 ]; 49 //获取输出需要设置代理,在代理方法中获取 50 [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 51 52 /** 53 接下来我们要做的不是立即开始会话(开始扫描),如果你现在调用会话的startRunning方法的话,你会发现屏幕是一片黑,这时由于我们还没有设置相机的取景器的大小。设置取景器需要用到AVCaptureVideoPreviewLayer这个类。具体代码如下: 54 */ 55 self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; 56 self.preview.videoGravity = AVLayerVideoGravityResize; 57 [self.preview setFrame:self.view.bounds];//设置取景器的frame 58 [self.view.layer insertSublayer:self.preview atIndex:0]; 59 60 // CGSize size = self.view.bounds.size; 61 // CGSize transparentAreaSize = CGSizeMake(200,200); 62 // CGRect cropRect = CGRectMake((size.width - transparentAreaSize.width)/2, (size.height - transparentAreaSize.height)/2, transparentAreaSize.width, transparentAreaSize.height); 63 // output.rectOfInterest = CGRectMake(cropRect.origin.y/size.width, 64 // cropRect.origin.x/size.height, 65 // cropRect.size.height/size.height, 66 // cropRect.size.width/size.width); 67 68 output.rectOfInterest = CGRectMake((124)/[[UIScreen mainScreen] bounds].size.height,(([[UIScreen mainScreen] bounds].size.width-220)/2)/[[UIScreen mainScreen] bounds].size.width,220/[[UIScreen mainScreen] bounds].size.height,220/[[UIScreen mainScreen] bounds].size.width); 69 //开始扫码 70 [self.session startRunning]; 71 } 72 73 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ 74 [self.session stopRunning];//停止会话 75 [self.preview removeFromSuperlayer];//移除取景器 76 if (metadataObjects.count > 0) { 77 AVMetadataMachineReadableCodeObject * obj = metadataObjects[0]; 78 NSString * result = obj.stringValue;//这就是扫描的结果 79 NSLog(@"outPut result == %@",result); 80 } 81 }