一、简要说明
- ZBarSDK集成了扫描二维码以及条形码功能。在iOS7.0之前iOS没有提供原生的二维码及条形码扫描功能,若要兼容iOS7.0之前的设备的话ZBarSDK是最佳选择。
二、集成方式
1、通过Cocoapods
- 将 pod 'ZBarSDK' 添加到Podfile文件中,然后在终端执行命令pod install
- 在要使用的类中引入头文件
#import <ZBarSDK.h>
- 如果使用ZBarReaderViewController则遵守协议ZBarReaderDelegate,如果使用ZBarReaderView则遵守协议ZBarReaderViewDelegate
@interface ViewController()<ZBarReaderDelegate>
或@interface ViewController()<ZBarReaderViewDelegate>
2、手动
- 拖拽ZBarSDK文件夹到你的项目,把添加libiconv.tbd、CoreMedia.framework、CoreVideo.framework、AVFoundation.framework、QuartzCore.framework到你的项目
- 在要使用的类中引入头文件
#import "ZBarSDK.h"
- 如果使用ZBarReaderViewController则遵守协议ZBarReaderDelegate,如果使用ZBarReaderView则遵守协议ZBarReaderViewDelegate
@interface ViewController()<ZBarReaderDelegate>
或@interface ViewController()<ZBarReaderViewDelegate>
三、用法
1、用ZBarReaderViewController实现二维码扫描功能
//创建ZBarReaderViewController实例
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;//设置代理
reader.supportedOrientationsMask = ZBarOrientationMaskAll;//支持横屏和竖屏
ZBarImageScanner *scanner = reader.scanner;
[scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0];
CGRect scanMaskRect = CGRectMake(ZYK_ZBAR_XLENGTH, ZYK_ZBAR_TOPBAR_HEIGHT+ZYK_ZBAR_YLENGTH, ZYK_ZBAR_SIZE, ZYK_ZBAR_SIZE); //扫描区域,一般选择屏幕中间区域
reader.readerView.scanCrop = [self getScanCrop:scanMaskRect readerViewBounds:reader.readerView.bounds];//扫描区域计算
[self presentViewController:reader animated:YES completion:nil];
//实现代理方法,对获取到的信息进行处理
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
if ([info count]>2) {
int quality = 0;
ZBarSymbol *bestResult = nil;
for(ZBarSymbol *sym in results) {
int q = sym.quality;
if(quality < q) {
quality = q;
bestResult = sym;
}
}
[picker dismissViewControllerAnimated:YES completion:nil];
[self performSelector: @selector(presentResult:) withObject: bestResult afterDelay: .001];
}else {
ZBarSymbol *symbol = nil;
for(symbol in results)
break;
[picker dismissViewControllerAnimated:YES completion:nil];
[self performSelector: @selector(presentResult:) withObject: symbol afterDelay: .001];
}
}
//实现代理方法,取消时获取到通知
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)presentResult:(ZBarSymbol*)sym {
if (sym) {
NSString *tempStr = sym.data;
//解决中文乱码问题
if ([sym.data canBeConvertedToEncoding:NSShiftJISStringEncoding]) {
tempStr = [NSString stringWithCString:[tempStr cStringUsingEncoding:NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];
}
NSLog(@"tempStr:%@",tempStr);
}
}
//用于自定制界面
- (void)setOverlayPickerView:(ZBarReaderViewController *)reader{
//清除reader视图上原有控件
for (UIView *temp in [reader.view subviews]) {
for (UIButton *button in [temp subviews]) {
if ([button isKindOfClass:[UIButton class]]) {
[button removeFromSuperview];
}
}
for (UIToolbar *toolbar in [temp subviews]) {
if ([toolbar isKindOfClass:[UIToolbar class]]) {
[toolbar setHidden:YES];
[toolbar removeFromSuperview];
}
}
}
/*
*在reader视图上自定制自己想要的界面,此处省略
*/
}
2、用ZBarReaderView实现二维码扫描功能(用于自定制界面)
//声明ZBarReaderView对象
@property (nonatomic,strong)ZBarReaderView *readerView;
_readerView = [[ZBarReaderView alloc]init];
ZBarImageScanner *scanner = [ZBarImageScanner new];//二维码/条形码识别设置
[scanner setSymbology:ZBAR_PARTIAL config:0 to:0];
[_readerView initWithImageScanner:scanner];
_readerView.tracksSymbols = NO;
_readerView.frame = CGRectMake(0, 0, ZYK_ZBAR_MAIN_WIDTH, ZYK_ZBAR_MAIN_HEIGHT);
_readerView.readerDelegate = self;//设置代理
/*
*在_readerView视图上自定制自己想要的界面,此处省略
*/
_readerView.torchMode = 0; //关闭闪光灯
CGRect scanMaskRect = CGRectMake(ZYK_ZBAR_XLENGTH, ZYK_ZBAR_TOPBAR_HEIGHT+ZYK_ZBAR_YLENGTH, ZYK_ZBAR_SIZE, ZYK_ZBAR_SIZE); //扫描区域,一般选择屏幕中间区域
_readerView.scanCrop = [self getScanCrop:scanMaskRect readerViewBounds:_readerView.bounds];//扫描区域计算
[_readerView start];//开启扫描,手机摄影头拍摄的即时图像才可以显示在readview上
[self.view addSubview:_readerView];//将其照相机拍摄视图添加到要显示的视图上
//扫描区域计算
- (CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds{
CGFloat x,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;
NSLog(@"x%f y%f width%f height%f",x,y,width,height);
return CGRectMake(x, y, width, height);
}
//实现代理方法,处理扫描到的二维码
- (void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image{
ZBarSymbol *symbol = nil;
for (symbol in symbols) {
break;
}
NSString *tempStr = symbol.data;
if ([symbol.data canBeConvertedToEncoding:NSShiftJISStringEncoding]) {
tempStr = [NSString stringWithCString:[tempStr cStringUsingEncoding:NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];
}
[readerView stop];
NSLog(@"tempStr:%@",tempStr);
[self dismissViewControllerAnimated:YES completion:nil];
}
四、当前版本
`1.3.1`