二维码扫描ZBarSDK的使用

本文介绍如何在iOS应用中整合ZBar SDK,实现二维码扫描功能。包括项目初始化、导入SDK、实现视图控制器和代理方法,以及在界面中添加扫描视图。同时,提供详细代码示例,帮助开发者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用ZBar项目。下载地址是: http://zbar.sourceforge.net/iphone/index.html


2.新建一个项目。

3.导入 ZBar的sdk。把ZBar SDK的目录拉入项目,然后选中copy选项

4.在项目文件的target中加入 以下framework

5.在appDelegate文件中加入 标记部分的代码

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  2. {  
  3.     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  
  4.     // Override point for customization after application launch.  
  5.     self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];  
  6.     self.window.rootViewController = self.viewController;  
  7.     [self.window makeKeyAndVisible];  
  8.       
  9.       
  10.     // force view class to load so it may be referenced directly from NIB  
  11.     [ZBarReaderView class];  
  12.       
  13.       
  14.     return YES;  
  15. }  

注意此代码:

  1. // force view class to load so it may be referenced directly from NIB  
  2.  [ZBarReaderView class];  


6.在.h文件中加入   ZBarReaderViewDelegate的实现,代码如下:
  1. //  
  2. //  ViewController.h  
  3. //  FootSafety  
  4. //  
  5. //  Created by 泽宇 徐 on 12-6-12.  
  6. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import "ZBarSDK.h"  
  11.   
  12. @interface ViewController : UIViewController<ZBarReaderViewDelegate>  
  13. {  
  14.     IBOutlet UILabel  * label ;  
  15.     ZBarReaderView *readerView;  
  16.     ZBarCameraSimulator *cameraSim;  
  17. }  
  18.   
  19. @property(nonatomic,retain) UILabel * label ;  
  20. @property (nonatomic, retain) IBOutlet ZBarReaderView *readerView;  
  21.   
  22.   
  23. @end  

7.在.m文件中要实现的主要方法是:

  1. - (void) readerView: (ZBarReaderView*) view  
  2.      didReadSymbols: (ZBarSymbolSet*) syms  
  3.           fromImage: (UIImage*) img  
  4. {  
  5.     // do something useful with results  
  6.     for(ZBarSymbol *sym in syms) {  
  7.         self.label.text = sym.data;  
  8.         break;  
  9.     }  
  10. }  

这里是功能是读取照片信息,把条码放如label显示


  1. -(void) viewDidAppear:(BOOL)animated  
  2. {  
  3.     // run the reader when the view is visible  
  4.     [readerView start];  
  5. }  

这个是在显示视图的时候,启动摄像头,开始扫描


  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view, typically from a nib.  
  5.       
  6.     // the delegate receives decode results  
  7.     readerView.readerDelegate = self;  
  8.       
  9.     // you can use this to support the simulator  
  10.     if(TARGET_IPHONE_SIMULATOR) {  
  11.         cameraSim = [[ZBarCameraSimulator alloc]  
  12.                      initWithViewController: self];  
  13.         cameraSim.readerView = readerView;  
  14.     }  
  15.   
  16. }  

在初始化的时候,设置托管。


.m文件所有内容是:

  1. //  
  2. //  ViewController.m  
  3. //  FootSafety  
  4. //  
  5. //  Created by 泽宇 徐 on 12-6-12.  
  6. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
  7. //  
  8.   
  9. #import "ViewController.h"  
  10.   
  11. @interface ViewController ()  
  12.   
  13. @end  
  14.   
  15. @implementation ViewController  
  16. @synthesize label;  
  17. @synthesize readerView;  
  18.   
  19. - (void)viewDidLoad  
  20. {  
  21.     [super viewDidLoad];  
  22.     // Do any additional setup after loading the view, typically from a nib.  
  23.       
  24.     // the delegate receives decode results  
  25.     readerView.readerDelegate = self;  
  26.       
  27.     // you can use this to support the simulator  
  28.     if(TARGET_IPHONE_SIMULATOR) {  
  29.         cameraSim = [[ZBarCameraSimulator alloc]  
  30.                      initWithViewController: self];  
  31.         cameraSim.readerView = readerView;  
  32.     }  
  33.   
  34. }  
  35.   
  36. -(void) viewDidAppear:(BOOL)animated  
  37. {  
  38.     // run the reader when the view is visible  
  39.     [readerView start];  
  40. }  
  41.   
  42.   
  43. - (void) readerView: (ZBarReaderView*) view  
  44.      didReadSymbols: (ZBarSymbolSet*) syms  
  45.           fromImage: (UIImage*) img  
  46. {  
  47.     // do something useful with results  
  48.     for(ZBarSymbol *sym in syms) {  
  49.         self.label.text = sym.data;  
  50.         break;  
  51.     }  
  52. }  
  53.   
  54.   
  55.   
  56. - (void)viewDidUnload  
  57. {  
  58.     [super viewDidUnload];  
  59.     // Release any retained subviews of the main view.  
  60. }  
  61.   
  62. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  63. {  
  64.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  65. }  
  66.   
  67. -(void) dealloc  
  68. {  
  69.     [self.readerView release];  
  70.     [self.label release];  
  71.     [super dealloc];  
  72. }  
  73.   
  74. @end  

在ViewController.xib文件中 增加一个view,并且修改view的类是ZBarReaderView ,并且指向 .h文件中定义的 
  1. ZBarReaderView *readerView;  

转载地址:http://blog.youkuaiyun.com/remote_roamer/article/details/7657845


关于ZBarReaderView 自定义UI界面


-(void)scanClick:(id)sender
{
// [appDelegate runUI:VIEW_SCAN_VIEW];

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
NSLog(@ " 跳转扫描扫描页面 " );
 
if (!self.zBarReaderView)
{
     self.zBarReaderView = [ZBarReaderViewController new ];
     self.zBarReaderView.readerDelegate = self;
     self.zBarReaderView.supportedOrientationsMask = ZBarOrientationMaskAll;
     self.zBarReaderView.showsZBarControls = NO;
     self.zBarReaderView.readerView.torchMode = 0 ;
     [self setOverlayPickerView:self.zBarReaderView];
 
     ZBarImageScanner *scanner = self.zBarReaderView.scanner;
     [scanner setSymbology: ZBAR_I25
                    config: ZBAR_CFG_ENABLE
                        to: 0 ];
 
}
 
[self presentViewController:self.zBarReaderView
                    animated:YES
                  completion:^( void )
                 {
                      // Code
                      NSLog(@ "弹出。。。。" );
                  }];

}

/**

  • 扫条形码结果
    **/

  • (void) imagePickerController: (UIImagePickerController) reader
    didFinishPickingMediaWithInfo: (NSDictionary
    ) info
    {
    id results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)

    ?
    1
    break ;

    //判断是否包含 头'http:'
    NSString regex = @“http+:[^\s]“;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@“SELF MATCHES %@“,regex];

    //判断是否包含 头'ssid:'
    NSString ssid = @“ssid+:[^\s]“;;
    NSPredicate ssidPre = [NSPredicate predicateWithFormat:@“SELF MATCHES %@“,ssid];
    NSString
    dataStr = symbol.data ;
    NSLog(@“ssidPre %@“, ssidPre);
    NSLog(@“predicate %@“, predicate);
    NSLog(@“dataStr %@“, dataStr);

    [self performSelector:@selector(disposeViewControl) withObject:FALSE afterDelay:5.0];
    }

/*
关闭页面
*/
-(void)disposeViewControl
{

?
1
2
3
4
5
6
[NSObject cancelPreviousPerformRequestsWithTarget:self selector: @selector (disposeViewControl) object:nil];
[self dismissViewControllerAnimated:YES
                       completion:^( void )
                       {
                           NSLog(@ "消失~~ " );
                        }];

}

  • (void)setOverlayPickerView:(ZBarReaderViewController *)reader
    {

    //清除所有内容
    for (UIView *temp in [reader.view subviews])
    {

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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];
         }
    }

    }
    //TITLE_HEIGHT : 64 头部高度
    tmpHeight = appDelegate.mainRootView.getRootHeight - 3TITLE_HEIGHT;
    tmpWidth = appDelegate.mainRootView.getRootWidth - 30;
    //最上部view
    UIView
    upView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, appDelegate.mainRootView.getRootWidth, TITLE_HEIGHT)];
    upView.alpha = 0.4;
    upView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:upView];

    //左侧的view
    UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, TITLE_HEIGHT, 15, tmpHeight)];
    leftView.alpha = 0.4;
    leftView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:leftView];

    //右侧的view
    UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(appDelegate.mainRootView.getRootWidth - 15, TITLE_HEIGHT, 15, tmpHeight)];
    rightView.alpha = 0.4;
    rightView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:rightView];

    //底部view
    UIView * downView = [[UIView alloc] initWithFrame:CGRectMake(0, tmpHeight + TITLE_HEIGHT, appDelegate.mainRootView.getRootWidth, 2*TITLE_HEIGHT)];
    downView.alpha = 0.4;
    downView.backgroundColor = [UIColor blackColor];
    [reader.view addSubview:downView];

    //最上层的操作 左边
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(15, 24, 30, 30);
    [button setBackgroundImage:[UIImage imageNamed:@“ocrBack”] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(leftClick:) forControlEvents:UIControlEventTouchUpInside];
    [reader.view addSubview:button];

    //右边
    UIButton * buttonRight = [UIButton buttonWithType:UIButtonTypeCustom];
    buttonRight.frame= CGRectMake(appDelegate.mainRootView.getRootWidth - 45, 24, 30, 30);
    [buttonRight setBackgroundImage:[UIImage imageNamed:@“ocr_flash_off”] forState:UIControlStateNormal];
    [buttonRight addTarget:self action:@selector(rightClick:) forControlEvents:UIControlEventTouchUpInside];
    [reader.view addSubview:buttonRight];

    //用于说明的label
    UILabel * labIntroudction= [[UILabel alloc] init];
    labIntroudction.backgroundColor = [UIColor clearColor];
    labIntroudction.frame=CGRectMake(0, 20, downView.frame.size.width, 50);
    labIntroudction.numberOfLines=2;
    labIntroudction.textColor=[UIColor whiteColor];
    labIntroudction.textAlignment = NSTextAlignmentCenter;
    labIntroudction.text=@“将二维码/条形码放入扫描框内\n自动识别不安全连接,请放心扫描”;
    [downView addSubview:labIntroudction];

    //4个角
    //左上
    UIImageView *leftUp=[[UIImageView alloc] initWithFrame:CGRectMake(13, TITLE_HEIGHT-2, 19, 19)];
    [leftUp setImage:[UIImage imageNamed:@“scan_1”]];
    [reader.view addSubview:leftUp];

    //右上
    UIImageView rightUp=[[UIImageView alloc] initWithFrame:CGRectMake(appDelegate.mainRootView.getRootWidth-13-19, TITLE_HEIGHT-2, 19, 19)];
    [rightUp setImage:[UIImage imageNamed:@“scan_2”]];
    [reader.view addSubview:rightUp];
    //左下
    UIImageView
    leftDown=[[UIImageView alloc] initWithFrame:CGRectMake(13, TITLE_HEIGHT+tmpHeight-15, 19, 19)];
    [leftDown setImage:[UIImage imageNamed:@“scan_3”]];
    [reader.view addSubview:leftDown];
    //右下
    UIImageView *rightDown=[[UIImageView alloc] initWithFrame:CGRectMake(appDelegate.mainRootView.getRootWidth-13-19, TITLE_HEIGHT+tmpHeight-15, 19, 19)];
    [rightDown setImage:[UIImage imageNamed:@“scan_4”]];
    [reader.view addSubview:rightDown];

    //滑动
    num =0;
    UIImage *image =[UIImage imageNamed:@“scan_net”];
    NSLog(@“image %f”, image.size.height);
    NSLog(@“image %f”, image.size.width);
    startY= TITLE_HEIGHT;
    scanNet = [[UIImageView alloc] initWithFrame:CGRectMake(15, startY, tmpWidth, tmpHeight)];
    scanNet.image = image;
    [reader.view addSubview:scanNet];
    // scanNet.layer.borderColor = [UIColor redColor].CGColor;
    // scanNet.layer.borderWidth = 1.0f;
    timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES];

}
-(void)animation1
{

?
1
2
3
4
5
6
num ++;
scanNet.frame = CGRectMake(scanNet.frame.origin.x, startY, scanNet.frame.size.width, 2 *num);
if ( 2 *num == tmpHeight)
{
    num = 0 ;
}

}

-(void) leftClick:(id)sender
{

?
1
[self disposeViewControl];

}

-(void) rightClick:(id)sender
{

?
1
2
3
4
5
6
7
8
9
10
11
UIButton *btn = (UIButton *)sender;
if (btn.selected)
{
     btn.selected = NO;
     self.zBarReaderView.readerView.torchMode = 0 ;
}
else
{
     btn.selected = YES;
     self.zBarReaderView.readerView.torchMode = 1 ;
}

}

转载地址:http://my.oschina.net/coper/blog/298438

ZBarReaderView使用:

ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController打开一个扫描界面,另一种方式是使用ZBar提供的可以嵌在其他视图中的ZBarReaderView,实际项目中我们更可能会使用第二种方式,这可以让我们对界面做更多的定制。

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];

以上代码需要说明的有以下几点:

  1. 闪光灯设置
    我不希望在扫描二维码时开启闪光灯,所以将ZBarReaderView的torchMode设为0,你可以将它设置为其他任何合适的值。
  2. 扫描区域计算
    这点比较重要,我们常用的二维码扫描软件的有效扫描区域一般都是中央区域,其他部分是不进行扫描的,ZBar可以通过ZBarReaderView的scanCrop属性设置扫描区域,它的默认值是CGRect(0,0, 1,1),表示整个ZBarReaderView区域都是有效的扫描区域。我们需要把扫描区域坐标计算为对应的百度分数坐标,也就是以上代码中调用的getScanCrop:readerViewBounds方法,亲测没有问题,如下所示:

 

-(CGRect)getScanCrop:(CGRect)rectreaderViewBounds:(CGRect)readerViewBounds
{
    CGFloatx,y,width,height;
     
    rect.origin.x  readerViewBounds.size.width;
    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];
}

转载地址: http://blog.sina.com.cn/s/blog_b8e976830101cpr7.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值