在使用AVFoundation以前用過,zbar,zxing來實現二維碼的生成以及解析,可是未進行掃描二維碼,經過查閱資料發現使用AVFoundation會更有優點。html
zbar和zxing有哪些優劣勢能夠看看:http://www.cocoachina.com/industry/20140530/8615.html 這篇文章,這裏就很少述。git
本文主要是爲了說明,在參考網上一些使用AVFoundation進行掃描去實現二維碼,條形碼掃描時出現的問題,解決的方法以及技巧。github
1、實現ide
參考上面提供的裏面的代碼,應該均可以實現效果,也能夠參考本人的寫的一個demo:https://github.com/yanghaha/HYScanningView spa
二,問題及解決rest
在封裝HYScanningView 這個控件的時候,發現掃描區域的設定的問題。code
查詢相關資料,發現好多資料也提到了關鍵點,設置AVCaptureMetadataOutput的rectOfInterest屬性,可是須要注意的是rectOfInterest這個範圍都是0~1之間的數值;並且在設置rectOfInterest的方法上大部分相似以下代碼htm
CGSize size = self.view.bounds.size; CGRect cropRect = CGRectMake(40, 100, 240, 240); CGFloat p1 = size.height/size.width; CGFloat p2 = 1920./1080.; //使用了1080p的圖像輸出 if (p1 < p2) { CGFloat fixHeight = bounds.size.width * 1920. / 1080.; CGFloat fixPadding = (fixHeight - size.height)/2; captureOutput.rectOfInterest = CGRectMake((cropRect.origin.y + fixPadding)/fixHeight, cropRect.origin.x/size.width, cropRect.size.height/fixHeight, cropRect.size.width/size.width); } else { CGFloat fixWidth = bounds.size.height * 1080. / 1920.; CGFloat fixPadding = (fixWidth - size.width)/2; captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height, (cropRect.origin.x + fixPadding)/fixWidth, cropRect.size.height/size.height, cropRect.size.width/fixWidth); }
這段代碼看上去沒問題,可是本人使用的是如下這段代碼get
CGRect rectOfInterest = [self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame]; _output.rectOfInterest = rectOfInterest;
使用it
self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame
這個獲取轉換後的rect時,須要確保 self.videoPreviewLayer已經添加到指定的layer上而且已顯示,