IOS7以前,開發者進行掃碼編程時,通常會藉助第三方庫。經常使用的是ZBarSDK,IOS7以後,系統的AVMetadataObject類中,爲咱們提供瞭解析二維碼的接口。通過測試,使用原生API掃描和處理的效率很是高,遠遠高於第三方庫。編程
官方提供的接口很是簡單,代碼以下:session
@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>//用於處理採集信息的代理 { AVCaptureSession * session;//輸入輸出的中間橋樑 } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //獲取攝像設備 AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //建立輸入流 AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; //建立輸出流 AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init]; //設置代理 在主線程裏刷新 [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; //初始化連接對象 session = [[AVCaptureSession alloc]init]; //高質量採集率 [session setSessionPreset:AVCaptureSessionPresetHigh]; [session addInput:input]; [session addOutput:output]; //設置掃碼支持的編碼格式(以下設置條形碼和二維碼兼容) output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]; AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:session]; layer.videoGravity=AVLayerVideoGravityResizeAspectFill; layer.frame=self.view.layer.bounds; [self.view.layer insertSublayer:layer atIndex:0]; //開始捕獲 [session startRunning]; }
以後咱們的UI上已經能夠看到攝像頭捕獲的內容,只要實現代理中的方法,就能夠完成二維碼條形碼的掃描:app
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects.count>0) { //[session stopRunning]; AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : 0 ]; //輸出掃描字符串 NSLog(@"%@",metadataObject.stringValue); } }
經過上面的代碼測試,咱們能夠發現系統的解析處理效率是至關的高,IOS官方提供的API也確實很是強大,然而,咱們能夠作進一步的優化,將效率更加提升:ide
首先,AVCaptureMetadataOutput類中有一個這樣的屬性(在IOS7.0以後可用):學習
@property(nonatomic) CGRect rectOfInterest;測試
這個屬性大體意思就是告訴系統它須要注意的區域,大部分APP的掃碼UI中都會有一個框,提醒你將條形碼放入那個區域,這個屬性的做用就在這裏,它能夠設置一個範圍,只處理在這個範圍內捕獲到的圖像的信息。如此一來,可想而知,咱們代碼的效率又會獲得很大的提升,在使用這個屬性的時候。須要幾點注意:優化
一、這個CGRect參數和普通的Rect範圍不太同樣,它的四個值的範圍都是0-1,表示比例。編碼
二、通過測試發現,這個參數裏面的x對應的偏偏是距離左上角的垂直距離,y對應的是距離左上角的水平距離。atom
三、寬度和高度設置的狀況也是相似。spa
三、舉個例子若是咱們想讓掃描的處理區域是屏幕的下半部分,咱們這樣設置
output.rectOfInterest=CGRectMake(0.5,0,0.5, 1);
具體apple爲何要設計成這樣,或者是這個參數個人用法那裏不對,還須要瞭解的朋友給個指導。
疏漏之處 歡迎指正
學習使用 歡迎轉載
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592