iOS二维码 扫描 可以使用SDK: ZXing和ZBar ,最终我选择了ZBar进行二维码识别,它的注释清晰,便于使用。而且导入库后不用多余的设置,直接根据官方文档提供的接口即可实现我们要的功能。
ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController打开一个扫描界面,另一种方式是使用ZBar提供的可以嵌在其他视图中的ZBarReaderView,实际项目中我们更可能会使用第二种方式,这可以让我们对界面做更多的定制。在这边我还是将2 种使用方法大概说一下。
首先是下载zbar,将ZBarSDK导入项目,在需要使用ZBar的文件中导入ZBarSDK.h,将AVFoundation.framework (weak)
CoreMedia.framework (weak)
CoreVideo.framework (weak)
QuartzCore.framework
libiconv.dylib 框架加入你的工程。
1.使用ZBarReaderViewController:主要代码:
@interface ReaderSampleViewController : UIViewController < ZBarReaderDelegate >
{
UIImageView *resultImage;
UITextView *resultText;
}
@property (nonatomic, retain) IBOutlet UIImageView *resultImage;
@property (nonatomic, retain) IBOutlet UITextView *resultText;
- (IBAction) scanButtonTapped;
@end
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation
{
return(YES);
}
//初始化 ZBarReaderViewController 并打开扫描
- (IBAction) scanButtonTapped
{
// ADD: present a barcode reader that scans from the camera feed
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
reader.supportedOrientationsMask = ZBarOrientationMaskAll;
ZBarImageScanner *scanner = reader.scanner;
// TODO: (optional) additional reader configuration here
// EXAMPLE: disable rarely used I2/5 to improve performance
[scanner setSymbology: ZBAR_I25
config: ZBAR_CFG_ENABLE
to: 0];
// present and release the controller
[self presentModalViewController: reader
animated: YES];
[reader release];
}
//实现delegate
- (void) imagePickerController: (UIImagePickerController*) reader
didFinishPickingMediaWithInfo: (NSDictionary*) info
{
// ADD: get the decode results
id<NSFastEnumeration> results =
[info objectForKey: ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results)
// EXAMPLE: just grab the first barcode
break;
// EXAMPLE: do something useful with the barcode data
resultText.text = symbol.data;
// EXAMPLE: do something useful with the barcode image
resultImage.image =
[info objectForKey: UIImagePickerControllerOriginalImage];
// ADD: dismiss the controller (NB dismiss from the *reader*!)
[reader dismissModalViewControllerAnimated: YES];
}
2.使用ZBarReaderView:主要代码:
#pragma mark 初始化扫描
- (void)InitScan
{
readview = [ZBarReaderView new];
readview.backgroundColor = [UIColor clearColor];
readview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
readview.readerDelegate = self;
readview.allowsPinchZoom = YES;//使用手势变焦
readview.trackingColor = [UIColor redColor];
readview.showsFPS = NO;// 显示帧率 YES 显示 NO 不显示
//readview.scanCrop = CGRectMake(0, 0, 1, 1);//将被扫描的图像的区域
UIImage *hbImage=[UIImage imageNamed:@"pick_bg.png"];
scanZomeBack=[[UIImageView alloc] initWithImage:hbImage];
//添加一个背景图片
CGRect mImagerect=CGRectMake((readview.frame.size.width-200)/2.0, (readview.frame.size.height-200)/2.0, 200, 200);
[scanZomeBack setFrame:mImagerect];
readview.scanCrop = [self getScanCrop:mImagerect readerViewBounds:readview.bounds];//将被扫描的图像的区域
[readview addSubview:scanZomeBack];
[readview addSubview:readLineView];
[self.view addSubview:readview];
[readview start];
}
#pragma mark 获取扫描区域
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds
{
CGFloat x,y,width,height;
x = rect.origin.x / readerViewBounds.size.width;
y = 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);
}
#pragma mark 扫描动画
-(void)loopDrawLine
{
CGRect rect = CGRectMake(scanZomeBack.frame.origin.x, scanZomeBack.frame.origin.y, scanZomeBack.frame.size.width, 2);
if (readLineView) {
[readLineView removeFromSuperview];
}
readLineView = [[UIImageView alloc] initWithFrame:rect];
[readLineView setImage:[UIImage imageNamed:@"line.png"]];
[UIView animateWithDuration:3.0
delay: 0.0
options: UIViewAnimationOptionCurveEaseIn
animations:^{
//修改fream的代码写在这里
readLineView.frame =CGRectMake(scanZomeBack.frame.origin.x, scanZomeBack.frame.origin.y+scanZomeBack.frame.size.height, scanZomeBack.frame.size.width, 2);
[readLineView setAnimationRepeatCount:0];
}
completion:^(BOOL finished){
if (!is_Anmotion) {
[self loopDrawLine];
}
}];
[readview addSubview:readLineView];
}
#pragma mark 获取扫描结果
- (void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image
{
// 得到扫描的条码内容
const zbar_symbol_t *symbol = zbar_symbol_set_first_symbol(symbols.zbarSymbolSet);
NSString *symbolStr = [NSString stringWithUTF8String: zbar_symbol_get_data(symbol)];
if (zbar_symbol_get_type(symbol) == ZBAR_QRCODE) {
// 是否QR二维码
}
for (ZBarSymbol *symbol in symbols) {
[sTxtField setText:symbol.data];
break;
}
[readerView stop];
[readerView removeFromSuperview];
}
有关于ZXing 的使用,我只是略看了 一下因为导入sdk 后 老是出现链接错误 ,查了好多资料搞不定,最后还是果断的选择了使用ZBar。希望大家 能 分享下ZXing 扫描二维码的方法。