在使用AVFoundation之前用过,zbar,zxing来实现二维码的生成以及解析,但是未进行扫描二维码,通过查阅资料发现使用AVFoundation会更有优势。
zbar和zxing有哪些优劣势可以看看:http://www.cocoachina.com/industry/20140530/8615.html 这篇文章,这里就不多述。
本文主要是为了说明,在参考网上一些使用AVFoundation进行扫描去实现二维码,条形码扫描时出现的问题,解决的方法以及技巧。
一、实现
参考上面提供的里面的代码,应该都可以实现效果,也可以参考本人的写的一个demo:https://github.com/yanghaha/HYScanningView
二,问题及解决
在封装HYScanningView 这个控件的时候,发现扫描区域的设定的问题。
查询相关资料,发现好多资料也提到了关键点,设置AVCaptureMetadataOutput的rectOfInterest属性,但是需要注意的是rectOfInterest这个范围都是0~1之间的数值;而且在设置rectOfInterest的方法上大部分类似如下代码
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);
}
这段代码看上去没问题,但是本人使用的是以下这段代码
CGRect rectOfInterest = [self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame];
_output.rectOfInterest = rectOfInterest;
使用
self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame
这个获取转换后的rect时,需要确保 self.videoPreviewLayer已经添加到指定的layer上并且已显示,