最近項(xiàng)目要實(shí)現(xiàn)掃描條形碼的功能,于是在網(wǎng)絡(luò)上搜尋快速的實(shí)現(xiàn)方案。
最早知道的方案就是ZXing這個Google的庫更啄,看了 iOS攻城獅的文章?后決定要用AVFoundation直接實(shí)現(xiàn)掃碼的功能了纳令。
然后柠贤,繼續(xù)搜比較實(shí)用的輪子帮孔。
CSDN中的這個例子講的很詳細(xì)雷滋,代碼?改改直接用上。
這份代碼有幾個問題:定時器導(dǎo)致內(nèi)存泄露你弦,設(shè)置掃描區(qū)域和模糊效果的代碼太生硬惊豺,需要改進(jìn)。
測試發(fā)現(xiàn)禽作,掃描區(qū)域設(shè)置的不準(zhǔn)確,然后查找相關(guān)資料揩页,確定元兇:rectOfInterest旷偿。
它是AVCaptureMetadataOutput的一個屬性,這篇文章有一個討論爆侣,官方也給出了解釋:
"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."
這個說的很簡單萍程,但是具體做起來還是挺抽象的。然后兔仰,在簡書中找到loongod的一篇文章茫负,進(jìn)而在Stack Overflow中找到問題的答案:How do I use the metadataOutputRectOfInterestForRect method and rectOfInterest property to scan a specific area? (QR Code)
根據(jù) loongod 的文章做代碼改進(jìn),特別是中間透空區(qū)域的實(shí)現(xiàn)乎赴。大功告成忍法!
附上GitHub上這個 Demo?。