最近在做的項(xiàng)目中需要用到二維碼掃描功能,之前在Android中使用過(guò)ZXing識(shí)別二維碼,ZXing也有對(duì)應(yīng)的iOS版本,經(jīng)過(guò)了解,ZBar也是一個(gè)常用的二維碼識(shí)別軟件,并分別提供了iOS和Android的SDK可供使用,最終我選擇了ZBar進(jìn)行二維碼識(shí)別,它的注釋清晰,便于使用。
ZBar為我們提供了兩種使用方式,一種是直接調(diào)用ZBar提供的ZBarReaderViewController打開(kāi)一個(gè)掃描界面,另一種方式 是使用ZBar提供的可以嵌在其他視圖中的ZBarReaderView,實(shí)際項(xiàng)目中我們更可能會(huì)使用第二種方式,這可以讓我們對(duì)界面做更多的定制。
ZBar使用起來(lái)也非常簡(jiǎn)單,將ZBarSDK導(dǎo)入項(xiàng)目,在需要使用ZBar的文件中導(dǎo)入ZBarSDK.h頭文件即可,以下是ZBarReaderView的初始化方法:
01 |
ZBarReaderView readerView = [[ZBarReaderView alloc]init]; |
02 |
readerView.frame = CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height - 44); |
03 |
readerView.readerDelegate = self; |
05 |
readerView.torchMode = 0; |
07 |
CGRect scanMaskRect = CGRectMake(60, CGRectGetMidY(readerView.frame) - 126, 200, 200); |
10 |
if (TARGET_IPHONE_SIMULATOR) { |
11 |
ZBarCameraSimulator *cameraSimulator |
12 |
= [[ZBarCameraSimulator alloc]initWithViewController:self]; |
13 |
cameraSimulator.readerView = readerView; |
15 |
[self.view addSubview:readerView]; |
17 |
readerView.scanCrop = [self getScanCrop:scanMaskRect readerViewBounds:self.readerView.bounds]; |
以上代碼需要說(shuō)明的有以下幾點(diǎn):
閃光燈設(shè)置
我不希望在掃描二維碼時(shí)開(kāi)啟閃光燈,所以將ZBarReaderView的torchMode設(shè)為0,你可以將它設(shè)置為其他任何合適的值。
掃描區(qū)域計(jì)算
這點(diǎn)比較重要,我們常用的二維碼掃描軟件的有效掃描區(qū)域一般都是中央?yún)^(qū)域,其他部分是不 進(jìn)行掃描的,ZBar可以通過(guò)ZBarReaderView的scanCrop屬性設(shè)置掃描區(qū)域,它的默認(rèn)值是CGRect(0, 0, 1, 1),表示整個(gè)ZBarReaderView區(qū)域都是有效的掃描區(qū)域。我們需要把掃描區(qū)域坐標(biāo)計(jì)算為對(duì)應(yīng)的百度分?jǐn)?shù)坐標(biāo),也就是以上代碼中調(diào)用的 getScanCrop:readerViewBounds方法,親測(cè)沒(méi)有問(wèn)題,如下所示:
01 |
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds |
03 |
CGFloat x,y,width,height; |
05 |
x = rect.origin.x / readerViewBounds.size.width; |
06 |
y = rect.origin.y / readerViewBounds.size.height; |
07 |
width = rect.size.width / readerViewBounds.size.width; |
08 |
height = rect.size.height / readerViewBounds.size.height; |
10 |
return CGRectMake(x, y, width, height); |
PS:在網(wǎng)上找到很多這個(gè)方法都是將橫坐標(biāo)和縱坐標(biāo)交叉,這樣是有問(wèn)題的,仔細(xì)想一下就會(huì)明白。
初始化部分完成之后,就可以調(diào)用ZBarReaderView的start方法開(kāi)始掃描了,需要讓你的類實(shí)現(xiàn) ZBarReaderViewDelegate協(xié)議,在掃描到二維碼時(shí)會(huì)調(diào)用delegate的對(duì)應(yīng)方法。最后,當(dāng)二維碼已經(jīng)識(shí)別時(shí)候,可以調(diào)用 ZBarReaderView的stop方法停止掃描。如下所示:
1 |
- ( void )readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image |
3 |
for (ZBarSymbol *symbol in symbols) { |
4 |
NSLog(@ "%@" , symbol.data); |
8 |
[self.readerView stop]; |
好了,就這么多,是不是非常簡(jiǎn)單?