在使用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上而且已显示,