今天查阅资料了很久,终于搞定了扫描二维码功能。
扫描二维码我用的是ZBar库。从网上下载下来ZBar SDK(下载地址:http://download.csdn.net/detail/wall_cow_ly/7168219)。将文件夹直接添加到项目中即可。在TARGETS / General / Linked Frameworks and Libraries下添加AVFoundation.framework、CoreMedia.framework、CoreVideo.framework、QuartzCore.framework、libiconv.dylib和libzbar.a这些库。
做好准备工作,我们新建一个视图控制器,在其上添加一个按钮和一个标签。点击按钮,就会显示扫描视图。标签是用来显示扫描结果的。
- (void)viewDidLoad
{
[super viewDidLoad];
//创建按钮
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 20, 100, 100)];
[button setTitle:@"扫描" forState:UIControlStateNormal];
button.backgroundColor = [UIColor cyanColor];
[self.view addSubview:button];
[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
//创建标签
self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, [UIScreen mainScreen].applicationFrame.size.height-100, 100, 100)];
[self.view addSubview:self.label];
}
创建扫描视图ZBarReaderView的实例之前,我们在视图控制器头文件中导入ZBarSDK.h,并为其添加一个属性ZBarReaderView *readerView。还要实现ZBarReaderViewDelegate代理协议,通过里面的代理方法来获得扫描结果。
点击按钮,执行onClick方法,创建ZBarReaderView扫描视图,然后设置它的一些属性,详见代码注释。最后执行[readerView start]开始扫描。
//点击执行
-(void)onClick{
self.label.text = @"";
//创建扫描视图
readerView = [[ZBarReaderView alloc] init];
//设置大小
readerView.frame = CGRectMake(0, 120,[UIScreen mainScreen].applicationFrame.size.width,[UIScreen mainScreen].applicationFrame.size.width);
//设置代理
readerView.readerDelegate = self;
//不开闪光灯
readerView.torchMode = 0;
//设置方框颜色
readerView.trackingColor = [UIColor greenColor];
[self.view addSubview:readerView];
//开始扫描
[readerView start];
}
实现readerView:didReadSymbols:fromImage:代理方法,来获得扫描到的数据。
//扫描到二维码后执行的代理方法
- (void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image
{
NSString *result = nil;
//遍历符号集合,获得符号
for (ZBarSymbol *symbol in symbols) {
NSLog(@"%@", symbol.data);
result = symbol.data;
break;
}
self.label.text = result;
//停止扫描视图
//[self.readerView stop];
}
在这里我们扫描到后,就将结果显示在标签上面。
最后在应用程序代理累中创建并添加视图控制器。
TestViewController *vc = [[TestViewController alloc] init];
self.window.rootViewController = vc;
运行,我随便对着网页上生成的二维码扫描,结果正确。
运行结果截图: