接上篇,因为使用AVFoundation一直无法扫描我们的二维码,最后决定使用条形码。我又在AVCaptureMetadataOutput的metadataObjectTypes中加入了EAN13的条形码类型(我们生成条形码使用的类型),不幸的是,还是无法识别,但是,百度其他的EAN13类型的条形码都可以识别出来,此问题仍未解决。
最后,我决定试一下ZBar,bingo!效率挺高。下面介绍一下zbar的使用过程。
首先,使用cocopods在项目中集成zbar,然后在头文件中导入ZBarSDK,因为我需要自定义扫描界面,所以使用ZBarReaderView,如下:
其中scanCrop是设置有效区域的一个属性,相当于
AVCaptureMetadataOutput中的rectOfInterest(具体信息可查看我的上一篇博客),其他属性不再赘述。
下面说一下在使用zbar过程中遇到的问题:
1.在使用AVFoundation时,配置各个类的实例变量时需要使用异步线程防止阻塞主线程加载界面。在使用zbarreaderview时,如果不用异步线程也会出现阻塞,但是,如果使用异步线程的话,会出现一个问题:进入扫码界面到出现镜头过程中需要等待一段时间,并且这段时间会随着进入这个界面的次数增加而增长,我发现问题在ZBarReaderView的实现文件ZBarReaderViewImpl的_initWithImageScanner方法中self.device =
[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];方法,但是问题还是没能解决(我真是太菜了,还请大神能指点一二),因为等待时间实在是无法接受,我又想到了另外一种方法:把添加扫描视图的方法从viewDidLoad移到viewDidAppear中,然后在ViewWillAppear中添加一个loading视图,这样点击进入扫描视图的页面的按钮时不需要等待,进入后出现loading,直到加载完成展示扫描视图。由于业务需要,扫描完成后,进入下一个页面进行操作,之后可以选择再次进入扫描视图,所以会再次执行viewDidAppear就会多次加载扫描视图,为了解决这个问题,我是用一个全局变量来保证扫描视图只加载一次。具体代码如下:
2.使用zbar进行扫描时,首次进入页面会镜头会出现抖动,具体原因不明,未解决。
总结:至此,扫描功能也算能够使用了,但是,由于个人能力有限,业务一再退让,问题还有很多。希望看到这篇博客的朋友能够帮忙解决一下,不胜感激。路漫漫其修远兮~~~