转自:http://blog.sina.com.cn/s/blog_b8e976830101cpr7.html
ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController
ZBar使用起来也非常简单,将ZBarSDK导入项目,在需要使用ZBar的文件中导入ZBarSDK.h头文件即可,以下是ZBarReaderView的初始化方法:
ZBarReaderViewreaderView
=
[[ZBarReaderViewalloc]init];
readerView.frame =
CGRectMake(0,
44,self.view.frame.size.width,self.view.frame.size.height
-
44);
readerView.readerDelegate =
self;
//关闭闪光灯
readerView.torchMode =
0;
//扫描区域
CGRectscanMaskRect =
CGRectMake(60,CGRectGetMidY(readerView.frame)
-
126,
200,
200);
//处理模拟器
if (TARGET_IPHONE_SIMULATOR)
{
ZBarCameraSimulator
*cameraSimulator
=
[[ZBarCameraSimulatoralloc]initWithViewController:self];
cameraSimulator.readerView
=
readerView;
}
[self.view addSubview:readerView];
//扫描区域计算
readerView.scanCrop =
[selfgetScanCrop:scanMaskRectreaderViewBounds:self.readerView.bounds];
[readerView start];
readerView.frame
readerView.readerDelegate
//关闭闪光灯
readerView.torchMode
//扫描区域
CGRectscanMaskRect
//处理模拟器
if
}
[self.view addSubview:readerView];
//扫描区域计算
readerView.scanCrop
[readerView start];
以上代码需要说明的有以下几点:
- 闪光灯设置
我不希望在扫描二维码时开启闪光灯,所以将ZBarReaderView的torchMode设为0,你可以将它设置为其他任何合适的值。 - 扫描区域计算
这点比较重要,我们常用的二维码扫描软件的有效扫描区域一般都是中央区域,其他部分是不进行扫描的,ZBar可以通过ZBarReaderView的scanCrop属性设置扫描区域,它的默认值是CGRect(0,0, 1,1),表示整个ZBarReaderView区域都是有效的扫描区域。我们需要把扫描区域坐标计算为对应的百度分数坐标,也就是以上代码中调用的getScanCrop:readerViewBounds方法,亲测没有问题,如下所示:
-(CGRect)getScanCrop:(CGRect)rectreaderViewBounds:(CGRect)readerViewBounds
{
CGFloatx,y,width,height;
x
=
rect.origin.x
/
readerViewBounds.size.width;
y
=
rect.origin.y
/
readerViewBounds.size.height;
width
=
rect.size.width
/
readerViewBounds.size.width;
height
=
rect.size.height
/
readerViewBounds.size.height;
return
CGRectMake(x,y, width, height);
}
{
}
PS:在网上找到很多这个方法都是将横坐标和纵坐标交叉,这样是有问题的,仔细想一下就会明白。
初始化部分完成之后,就可以调用ZBarReaderView的start方法开始扫描了,需要让你的类实现ZBarReaderViewDelegate协议,在扫描到二维码时会调用delegate的对应方法。最后,当二维码已经识别时候,可以调用ZBarReaderView的stop方法停止扫描。如下所示:
-
(void)readerView:(ZBarReaderView
*)readerViewdidReadSymbols:(ZBarSymbolSet
*)symbolsfromImage:(UIImage
*)image
{
for
(ZBarSymbol
*symbol
in
symbols)
{
NSLog(@"%@", symbol.data);
break;
}
[self.readerView stop];
}
{
}