*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成功
[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输出,用作显示扫描结果
- (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方法执行以初始化扫描界面
- (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); }