iOS中Zbar二维码扫描的使用

在iOS开发中,如何使用Zbar扫描第三方库。

1)由于苹果的要求,从2015年2月1日开始,所有新上传的APP必须支持64位已经使用iOS8的SDK。具体苹果方便的声明信息的链接如下:https://developer.apple.com/news/?id=10202014a,当我们在进行二维码扫描时,会发现原来的Zbar库会不支持如下的设备:iPhone 5s,iPhone 6,iPhone 6P,原因就是这三类设备的指令集为arm64。

2)由于必须支持64位的要求,我们引用的第三方库也必须遵守。(主要针对第三方库已静态库文件.a和框架形framework形式存在的),我们可以在终端按下面的操作来判断当前第三个库支持哪些架构(指令集)
a)进入到相应包含第三方框架中静态文件后框架的文件路径
b)在终端使用如下命令 lipo -info libzbar.a
[url=%20https://github.com/eric-schmitt/ZBar-arm64,1] https://github.com/eric-schmitt/ZBar-arm64[/url]
如若我的Zbar库在桌面,你可以按如下步骤。
a)cd /Users/pianopeng/Desktop/ZBar_arm64
b)lipo -info libzbar.a 

终端会如下输出:Architectures in the fat file: libzbar.a are: armv7 armv7s i386 x86_64 arm64 
其中armv7为iPhone4、4s的CPU使用的指令集,armv7s为5、5c的CPU使用的指令集,arm64为iPhone 5s,iPhone 6,iPhone 6P的CPU使用的指令集。i386 x86_64为模拟器使用的。
有关指令集与架构的相关信息可以参考如下链接的信息http://www.cocoachina.com/industry/20140527/8566.html,以及如何支持64位http://www.cocoachina.com/ios/20141024/10031.html

3)开始部署Zbar库
a)将Zbar库拖到自己的工程的根目录下,(当然可以按照你自己的喜欢,尽情的添加到哪里,只要你觉得合适)
b)添加相应的框架AVFoundation.framework,CoreMedia.framework,CoreVideo.framework,QuartzCore.framework,libiconv.dylib。
c)开始代码实现,在需要实现扫描的页面里导入#import "ZBarSDK.h"。并遵守相关的协议。具体的代码以及注释如下所示。

#import "ECScanViewController.h"
#import "ZBarSDK.h"

@interface ECScanViewController ()<ZBarReaderDelegate>
@property (strong, nonatomic) ZBarReaderViewController *readerVC;
@property (assign, nonatomic) NSInteger num;
@property (strong, nonatomic) NSTimer *timer;
@end

@implementation ECScanViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.navigationItem.title = @"扫一扫";
    self.view.backgroundColor = [UIColor clearColor];
    
    //创建readerVC
    self.readerVC= [[ZBarReaderViewController alloc] init];
    //设置代理
    self.readerVC.readerDelegate = self;
    //设置支持的扫描方向
    self.readerVC.supportedOrientationsMask = ZBarOrientationMaskAll;
    //设置是否显示底部控制按钮
    self.readerVC.showsZBarControls = NO;
    //设置扫描有效区域
   // self.readerVC.scanCrop= CGRectMake(0.1,32/(ScreenHeight - 64), 0.8, (ScreenHeight/2)/(ScreenHeight - 64));
    [self.readerVC.scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0];
    //必须将其添加到self.view上
    [self.view addSubview:self.readerVC.view];
    
    NSLog(@"self.view %@, self.readerVC.view %@, self.readVC.readerView %@",NSStringFromCGRect(self.view.frame), NSStringFromCGRect(self.readerVC.view.frame), NSStringFromCGRect(self.readerVC.readerView.frame));
    
    //设置覆盖物
    [self setOverlayPickerView:self.readerVC];
    //设置背景图
    [self setScanBackground:self.readerVC];
    //添加底部的相册与闪光灯
    [self setCameraAndtorchView:self.readerVC];
    
    //创建定时器,使扫描线上下移动
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(movePick_line) userInfo:nil repeats:YES];
}

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    if (self.readerVC) {
        [self.readerVC.readerView start];
    }
}

- (void)viewWillDisappear:(BOOL)animated{
    if (self.readerVC) {
        [self.readerVC.readerView stop];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - setOverlayPickerView
- (void)setOverlayPickerView:(ZBarReaderViewController *)reader

{
    
    //最上部view
    UIView* upView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, 32)];
    upView.alpha = 0.3;
    upView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:upView];
    
    //左侧的view
    UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 32 , ScreenWidth/10, ScreenHeight / 2)];
    leftView.alpha = 0.3;
    leftView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:leftView];
    
    
    //右侧的view
    UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(ScreenWidth - ScreenWidth/10, 32, ScreenWidth * 0.8, ScreenHeight/2)];
    rightView.alpha = 0.3;
    rightView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:rightView];
    
    
    //底部view
    UIView * downView = [[UIView alloc] initWithFrame:CGRectMake(0, ScreenHeight/2 + 32, ScreenWidth, 60)];
    downView.alpha = 0.3;
    downView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:downView];
    
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(ScreenWidth/10, 20, ScreenWidth * 0.8, 21)];
    titleLabel.text = @"将二维码/条码放入框内,即可自动扫描";
    titleLabel.textColor = [UIColor whiteColor];
    titleLabel.font = [UIFont systemFontOfSize:14];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    [downView addSubview:titleLabel];
}

#pragma mark - setScanBackground
- (void)setScanBackground:(ZBarReaderViewController *)reader{

    UIImageView *pick_bgImgView = [[UIImageView alloc] initWithFrame:CGRectMake(ScreenWidth/10, 32, ScreenWidth * 0.8, ScreenHeight/2)];
    pick_bgImgView.image = [UIImage imageNamed:@"pick_bg"];
    [reader.view addSubview:pick_bgImgView];

    UIImageView *pick_lineImgView = [[UIImageView alloc] initWithFrame:CGRectMake(ScreenWidth/10 + 5, 32, ScreenWidth * 0.8 - 10, 6)];
    pick_lineImgView.image = [UIImage imageNamed:@"pick_line"];
    pick_lineImgView.tag = 101;
    [reader.view addSubview:pick_lineImgView];
}

#pragma mark - 底部的相册以及闪光灯
- (void)setCameraAndtorchView:(ZBarReaderViewController *)reader{

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, ScreenHeight *0.5 +32 +60, ScreenWidth, ScreenHeight *0.5 - 92 - 64)];
    view.alpha = 0.8;
    view.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:view];
}

#pragma mark - movePick_line
- (void)movePick_line{
    UIImageView *pick_lineImgView = (UIImageView *)[self.readerVC.view viewWithTag:101];
    
    if (pick_lineImgView.frame.origin.y < 32 + ScreenHeight/2 - 6) {
        CGFloat y = pick_lineImgView.frame.origin.y +  2;
        pick_lineImgView.frame = CGRectMake(ScreenWidth/10 + 5, y , ScreenWidth *0.8 - 10, 6) ;
    }
        
    if (pick_lineImgView.frame.origin.y == 32 + ScreenHeight/2 - 6) {
        self.num = 0;
        pick_lineImgView.frame = CGRectMake(ScreenWidth/10 + 5, 32, ScreenWidth * 0.8 -10, 6);
    }
}

#pragma mark - ZBarReaderDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//     id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];
//    
//    ZBarSymbol *symbol = nil;
//    for(symbol in results)
//        break;
//    
//    NSString *barcode = symbol.data;
//    NSLog(@"barcode %@", barcode);
    
    UIImage * image = [info objectForKey:UIImagePickerControllerOriginalImage];
    //初始化
    ZBarReaderController * readerCtl = [ZBarReaderController new];
    //设置代理
    readerCtl.readerDelegate = self;
    
    CGImageRef cgImageRef = image.CGImage;
    ZBarSymbol * symbol = nil;
    id <NSFastEnumeration> results = [readerCtl scanImage:cgImageRef];
    for (symbol in results)
        break;
    
    NSString * result;
    if ([symbol.data canBeConvertedToEncoding:NSShiftJISStringEncoding]){
        result = [NSString stringWithCString:[symbol.data cStringUsingEncoding: NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding];
    }
    else{
        result = symbol.data;
    }
    NSLog(@"%@",result);

    //发送扫描结果的通知
    [[NSNotificationCenter defaultCenter] postNotificationName:kBarCodeRusult object:self userInfo:@{kBarCodeRusult : result}];
    
    //扫描完毕时,定时器失效,以免耗费内存
    [self.timer invalidate];
     self.timer = nil;
    //停止扫描
    [self.readerVC.readerView stop];
    //扫描界面退出
    [self.navigationController popViewControllerAnimated:YES];
}
@end

posted @ 2016-02-22 15:39  水清清  阅读(469)  评论(0编辑  收藏  举报