ios原生二维码扫描
做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing。今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描。
首先需要添加AVFoundation.framework框架到你工程中buildphase的"LinkBinaryWithLibraries"之下,然后就可以开始了。
一、做好准备工作,搭建UI
UI效果如图
IBOutlet、IBAction如下:
@property(weak,nonatomic)IBOutletUIView*viewPreview; @property(weak,nonatomic)IBOutletUILabel*lblStatus; @property(weak,nonatomic)IBOutletUIButton*startBtn; -(IBAction)startStopReading:(id)sender;
接下来就都是代码的事情了
二、控制器ViewController.h
首先导入AVFoundation框架
#import<AVFoundation/AVFoundation.h>
然后控制器实现AVCaptureMetadataOutputObjectsDelegate协议
@interfaceViewController()<AVCaptureMetadataOutputObjectsDelegate>
整体property如下:
@property(strong,nonatomic)UIView*boxView; @property(nonatomic)BOOLisReading; @property(strong,nonatomic)CALayer*scanLayer; -(BOOL)startReading; -(void)stopReading;
//捕捉会话
@property(nonatomic,strong)AVCaptureSession*captureSession;
//展示layer
@property(nonatomic,strong)AVCaptureVideoPreviewLayer*videoPreviewLayer;
然后在ViewDidLoad方法中初始化
-(void)viewDidLoad{ [superviewDidLoad]; _captureSession=nil; _isReading=NO; }
接下来实现startReading方法(这可就是重点咯)
-(BOOL)startReading{ NSError*error; //1.初始化捕捉设备(AVCaptureDevice),类型为AVMediaTypeVideo AVCaptureDevice*captureDevice=[AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo]; //2.用captureDevice创建输入流 AVCaptureDeviceInput*input=[AVCaptureDeviceInputdeviceInputWithDevice:captureDeviceerror:&error]; if(!input){ NSLog(@"%@",[errorlocalizedDescription]); returnNO; } //3.创建媒体数据输出流 AVCaptureMetadataOutput*captureMetadataOutput=[[AVCaptureMetadataOutputalloc]init]; //4.实例化捕捉会话 _captureSession=[[AVCaptureSessionalloc]init]; //4.1.将输入流添加到会话 [_captureSessionaddInput:input]; //4.2.将媒体输出流添加到会话中 [_captureSessionaddOutput:captureMetadataOutput]; //5.创建串行队列,并加媒体输出流添加到队列当中 dispatch_queue_tdispatchQueue; dispatchQueue=dispatch_queue_create("myQueue",NULL); //5.1.设置代理 [captureMetadataOutputsetMetadataObjectsDelegate:selfqueue:dispatchQueue]; //5.2.设置输出媒体数据类型为QRCode [captureMetadataOutputsetMetadataObjectTypes:[NSArrayarrayWithObject:AVMetadataObjectTypeQRCode]]; //6.实例化预览图层 _videoPreviewLayer=[[AVCaptureVideoPreviewLayeralloc]initWithSession:_captureSession]; //7.设置预览图层填充方式 [_videoPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill]; //8.设置图层的frame [_videoPreviewLayersetFrame:_viewPreview.layer.bounds]; //9.将图层添加到预览view的图层上 [_viewPreview.layeraddSublayer:_videoPreviewLayer]; //10.设置扫描范围 captureMetadataOutput.rectOfInterest=CGRectMake(0.2f,0.2f,0.8f,0.8f); //10.1.扫描框 _boxView=[[UIViewalloc]initWithFrame:CGRectMake(_viewPreview.bounds.size.width*0.2f,_viewPreview.bounds.size.height*0.2f,_viewPreview.bounds.size.width-_viewPreview.bounds.size.width*0.4f,_viewPreview.bounds.size.height-_viewPreview.bounds.size.height*0.4f)]; _boxView.layer.borderColor=[UIColorgreenColor].CGColor; _boxView.layer.borderWidth=1.0f; [_viewPreviewaddSubview:_boxView]; //10.2.扫描线 _scanLayer=[[CALayeralloc]init]; _scanLayer.frame=CGRectMake(0,0,_boxView.bounds.size.width,1); _scanLayer.backgroundColor=[UIColorbrownColor].CGColor; [_boxView.layeraddSublayer:_scanLayer]; NSTimer*timer=[NSTimerscheduledTimerWithTimeInterval:0.2ftarget:selfselector:@selector(moveScanLayer:)userInfo:nilrepeats:YES]; [timerfire]; //10.开始扫描 [_captureSessionstartRunning]; returnYES; }
实现AVCaptureMetadataOutputObjectsDelegate协议方法
#pragmamark-AVCaptureMetadataOutputObjectsDelegate -(void)captureOutput:(AVCaptureOutput*)captureOutputdidOutputMetadataObjects:(NSArray*)metadataObjectsfromConnection:(AVCaptureConnection*)connection { //判断是否有数据 if(metadataObjects!=nil&&[metadataObjectscount]>0){ AVMetadataMachineReadableCodeObject*metadataObj=[metadataObjectsobjectAtIndex:0]; //判断回传的数据类型 if([[metadataObjtype]isEqualToString:AVMetadataObjectTypeQRCode]){ [_lblStatusperformSelectorOnMainThread:@selector(setText:)withObject:[metadataObjstringValue]waitUntilDone:NO]; [selfperformSelectorOnMainThread:@selector(stopReading)withObject:nilwaitUntilDone:NO]; _isReading=NO; } } }
实现计时器方法moveScanLayer:(NSTimer*)timer
-(void)moveScanLayer:(NSTimer*)timer { CGRectframe=_scanLayer.frame; if(_boxView.frame.size.height<_scanLayer.frame.origin.y){ frame.origin.y=0; _scanLayer.frame=frame; }else{ frame.origin.y+=5; [UIViewanimateWithDuration:0.1animations:^{ _scanLayer.frame=frame; }]; } }
实现开始和停止方法
-(IBAction)startStopReading:(id)sender{ if(!_isReading){ if([selfstartReading]){ [_startBtnsetTitle:@"Stop"forState:UIControlStateNormal]; [_lblStatussetText:@"ScanningforQRCode"]; } } else{ [selfstopReading]; [_startBtnsetTitle:@"Start!"forState:UIControlStateNormal]; } _isReading=!_isReading; } -(void)stopReading{ [_captureSessionstopRunning]; _captureSession=nil; [_scanLayerremoveFromSuperlayer]; [_videoPreviewLayerremoveFromSuperlayer]; }
以上内容就是本文给大家介绍ios原生二维码扫描的全部内容,希望大家喜欢。