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原生二维码扫描的全部内容,希望大家喜欢。