#1引用ZbarSDK
*1)到ZbarSDK开源Github下载zip文件,https://github.com/arciem/ZBarSDK
*2)使用Xcode4.6.3建立一个single view application project,项目名为"iOS自定义zbarsdk扫描界面"
(为方便测试,使用Xcode4.6.3,如果使用Xcode5以上版本的要注意target和iOS版本问题和屏幕大小等界面问题)
*3)将解压后的ZbarSDK文件夹(其它文件不需要)复制到新建的项目下
*4)优化ZbarSDK文件夹,直接将文件夹里的resources文件夹删除
*5)将新添加的ZbarSDK文件夹添加到项目下,右击项目名------add file to,选择ZbarSDK
*6)添加ZbarSDK依赖的框架
* AVFoundation.framework
* CoreMedia.framework
* CoreVideo.framework
* QuartzCore.framework
* libiconv.dylib
*7)右击product------build for testing,如果出现如下错误(使用Xcode4.6.3以上版本会出现此问题)
ZBarSDK/libzbar.a' for architecture armv7s clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法为:点击项目名------build settings------查找valid architectures后双击并删除armv7s即可
再次右击product------build for testing,没有错误即引用ZbarSDK成功
#2自定义ZbarSDK扫描界面
[ZBarReaderView class],并添加import语句:#import "ZBarSDK.h"
#import "AppDelegate.h"
#import "ZBarSDK.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[ZBarReaderView class];
return YES;
}
在viewcontroller.m实现以下两个方法
- (void)viewDidAppear:(BOOL)animated{
//开启扫描
[self.readerView start];
}
-(void)viewDidDisappear:(BOOL)animated{
//关闭扫描
[self.readerView stop];
}
*3)添加边框,在view上再添加四个view,并设置颜色为50%透明度的BackColor
(选择BackGround------BackColor------再次选择Other------设置透明度为50%)
设置第一个view的大小位置为(306,0,14,242),第二个view的大小位置为(14, 0,292, 14)
设置第三个view的大小位置为(0 ,0,14,242),第四个view的大小位置为(0,242,320,218)
此时可以运行程序看一下效果,如图一所示
*4)添加四个角的直角边框,方法同上,颜色为白色,再在下方任意添加一些按钮来美化界面,再添加红色基准线,并让其闪动
具体可查看代码,结果如图二所示
//定时器使基准线闪动
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(lineAnimation) userInfo:nil repeats:YES];
-(void)lineAnimation{
float x = self.redLine.frame.origin.x;
float y = self.redLine.frame.origin.y;
float xSize = self.redLine.frame.size.width;
if (upOrdown == NO) {
self.redLine.frame = CGRectMake(x, y, xSize, 0.3);
upOrdown = YES;
}
else {
self.redLine.frame = CGRectMake(x, y, xSize, 0);
upOrdown = NO;
}//upOrdown变量在ViewController.h声明
}
*5)在底部添加一个TextView,命名为scanResult,设置背景颜色为ClearColor,字体颜色为白色,并添加OutLet输出,用作显示扫描结果接着实现ZBarReaderViewDelegate协议,在viewcontroller.h文件实现ZBarReaderViewDelegate协议
在viewcontroller.m文件实现协议方法readerView:didReadSymbols:romImage:以获取扫描结果并显示到TextView上
具体可参考代码,运行扫描结果如图三所示
- (void) readerView: (ZBarReaderView*) view didReadSymbols: (ZBarSymbolSet*) syms fromImage: (UIImage*) img{
//处理扫描结果
ZBarSymbol *sym =nil;
for(sym in syms)
break;
//停止扫描
[self.readerView stop];
//扫描结束,移除红线并显示结果
[self.redLine removeFromSuperview];
self.scanResult.text = sym.data;
}
*6)优化扫描界面,定义一个 initscan方法并在ViewDidLoad方法执行以初始化扫描界面
包括不显示跟踪框(已有红色闪动基准线),关闭闪光灯(iOS7下会一直打开),设置拍摄屏幕大小和设置扫描区域大小
最终运行扫描结果如图四所示
- (void)initScan{
//不显示跟踪框
_readerView.tracksSymbols = NO;
//关闭闪关灯
_readerView.torchMode = 0;
//二维码拍摄的屏幕大小
CGRect rvBounsRect = CGRectMake(0, 0, 320, [UIScreen mainScreen].bounds.size.height);
//二维码拍摄时,可扫描区域的大小
CGRect scanCropRect = CGRectMake(0, 0, 320, 240);
//设置ZBarReaderView的scanCrop属性,默认范围是0~1,使用getScanCrop进行转换
_readerView.scanCrop = [self getScanCrop:scanCropRect readerViewBounds:rvBounsRect];
}
//设置可扫描区的scanCrop的方法
- (CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)rvBounds{
CGFloat x,y,width,height;
x = rect.origin.y / rvBounds.size.height;
y = 1 - (rect.origin.x + rect.size.width) / rvBounds.size.width;
width = (rect.origin.y + rect.size.height) / rvBounds.size.height;
height = 1 - rect.origin.x / rvBounds.size.width;
return CGRectMake(x, y, width, height);
}
#3其它
*1)ZbarSDK无需在模拟器上进行测试,可以扫描多种二维码和条形码,请在真机上测试和使用*2)程序代码下载,内附两张二维码图片 http://download.csdn.net/detail/u010520912/7116643
*3)API 文档 http://zbar.sourceforge.net/iphone/sdkdoc/index.html