今天我們接着聊聊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的這項涉及折騰慘了,反正我是被耍猴了!好了今天就跟大家聊着了,后續會繼續更新其他內容,非常感謝!
轉載請注明出處!尊重原創!