今天我们接着聊聊iOS系统实现二维码扫描的其他注意点。
大家还记得前面我们用到的输出数据的类对象吗?AVCaptureMetadataOutput,就是它!如果我们需要实现目前主流APP扫描二维码的功能,即只有当二维码进入视图中心的方框中时才进行扫描识别功能,这样做的目的主要是为了提高用户的使用体验,需要用到这个类里面的一个属性:rectOfInterest,这个属性是一个CGRect结构体类型。但和我们平时经常使用的CGRect有点不一样。以下截取了官网文档对这个属性的表述:
/*!
@property rectOfInterest
@abstract Specifies a rectangle of interest for limiting the search area for visual metadata.
@discussion The value of this property is a CGRect that determines the receiver‘s rectangle of interest for each frame of video.
The rectangle‘s origin is top left and is relative to the coordinate space of the device providing the metadata. Specifying
a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the
value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.
*/
@property(nonatomic) CGRect rectOfInterest NS_AVAILABLE_IOS(7_0);
从以上属性和目前网络上的资源了解到,这个属性的作用大致是设置有效扫描的区域,具体到CGRectMake(x,y,width,height)中每一项的属性,可以这样来解释:
1.x和y表示我们将要设置的有效扫描区域左上角位置到我们已经设置的预览层的上边和左边的值,width和height则分别为有效扫描区域的高度和宽度。其实写到这儿,大家已经能够感觉到这个属性的特别了吧?就是将我们平时用的CGRect结构体的x和y交换位置,width和height交换位置。
2.但是,x,y,width,height的值均为0~1之间的任意值,也就是将原来的绝对值转换为所占区域的比例值。
按照这样的解释,在实际代码中去测试,发现完全不是这么回事,但经过反复的测试,终于发现了其中的秘密,这或许也就是Apple的设计和官网说明文档中存在的bug,误导了广大的开发者。
正确的理解应该是这样的:
记住两个点就可以完美的掌控这一切,1.有效扫描区域的左上角点(这跟iOS原点在左上角是一致的);2.预览层的原点位置却在右上角(不知道是不是Apple设计上的失误导致的,如果不是,只能说是奇葩设计了)。即需要更正上面的理解和目前网络上的大部分理解了,x值代表有效扫描区域左上角距离预览层顶部的距离,y值代码有效扫描区域左上角距离预览层右边的距离。
不知道各位是不是被Apple的这项涉及折腾惨了,反正我是被耍猴了!好了今天就跟大家聊着了,后续会继续更新其他内容,非常感谢!
转载请注明出处!尊重原创!