二维码扫描之ZBarSDK使用详解

一、简要说明

  • 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`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值