iOS開發(fā)中 二維碼掃描
前言
在移動開發(fā)中二維碼掃描這種事情越來越常見了盗誊,在iOS中我選擇了用ZBar這個第三方來實現(xiàn)时甚。
原因有三:好用隘弊,好用,好用荒适。
好了來點正經(jīng)的干貨吧梨熙。首先獻上下載地址:快來點我
然后你就可以把整個 ZBar文件夾拉到你的項目的Lib之類的目錄下面了。
如果用pod刀诬,就直接 pod 'ZBarSDK', '~> 1.3.1' 串结, 那么你就可以越過下面那個添加庫類的步驟了。
ZBar的使用給我們倆種選擇舅列,一種是自定義一個二維碼視圖,另一種是用他們自帶的二維碼視圖(奇丑無比)卧蜓。
添加庫類
如下添加這些庫類帐要。
ZBar庫類
自定義二維碼視圖
一般都是給一個按鈕綁定一個點擊事件,然后當按鈕點擊的時候 就會調用二維碼掃描弥奸,然后掃描成功就返回榨惠。
就像下面這個demo截圖一樣。
Demo截圖.png
然后就是正題了盛霎,我們首先要#import "ZBarSDK.h"
.然后自定義的話 就要遵循這個代理<ZBarReaderViewDelegate>
然后就可以在點擊的回調函數(shù)中設置如下:
// Do any additional setup after loading the view.
//初始化照相機窗口 這個readview 就是要美化的view
ZBarReaderView *readview = [ZBarReaderView new];
//自定義大小
readview.frame = CGRectMake(100, 100, 300, 300);
//自定義添加相關指示.........發(fā)揮各自的APP的想象力
//此處省略美化10000行代碼...................
//………………………..
// 好進入正題—— 接著設置好代理
readview.readerDelegate = self;
//將其照相機拍攝視圖添加到要顯示的視圖上
[self.view addSubview:readview];
//二維碼/條形碼識別設置
ZBarImageScanner *scanner = readview.scanner;
[scanner setSymbology: ZBAR_I25
config: ZBAR_CFG_ENABLE
to: 0];
//啟動赠橙,必須啟動后,手機攝影頭拍攝的即時圖像菜可以顯示在readview上
[readview start];
還要實現(xiàn)如下delegate方法愤炸,監(jiān)聽掃描成功回調:
-(void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image
{
ZBarSymbol *symbol = nil;
for (symbol in symbols)
{
break;
}
//掃描成功期揪,讓readerView消失
[readerView removeFromSuperview];
//這個是二維碼得到的數(shù)據(jù)
NSString *data = symbol.data;
//數(shù)據(jù)處理
//.......
}
自帶的二維碼視圖
和上面不同的是,這次我們要遵從的delegate變了是<ZBarReaderDelegate>
.
然后再cilck方法里實現(xiàn)以下代碼:
//初始化相機控制器
ZBarReaderViewController *reader = [ZBarReaderViewController new];
//設置代理
reader.readerDelegate = self;
//基本適配
reader.supportedOrientationsMask = ZBarOrientationMaskAll;
//二維碼/條形碼識別設置
ZBarImageScanner *scanner = reader.scanner;
[scanner setSymbology: ZBAR_I25
config: ZBAR_CFG_ENABLE
to: 0];
//彈出系統(tǒng)照相機规个,全屏拍攝
[self presentModalViewController: reader animated: YES];
然后實現(xiàn)以下的delegate.
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
id<NSFastEnumeration> symbols = [info objectForKey:ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for (symbol in symbols)
{
break;
}
[picker dismissModalViewControllerAnimated:YES];
//數(shù)據(jù)
NSString *data = symbol.data;
}
我自定義的 二維碼View
- (void)setOverlayPickerView:(ZBarReaderView *)reader
{
//清除原有控件
for (UIView *temp in [reader subviews]) {
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];
}
}
}
/*
//畫中間的基準線 可有可無 個人愛好
UIView* line = [[UIView alloc] initWithFrame:CGRectMake(40, 220, 240, 1)];
line.backgroundColor = [UIColor redColor];
[reader addSubview:line];
*/
//最上部view
UIView* upView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 80)];
upView.alpha = 0.3;
upView.backgroundColor = [UIColor blackColor];
[reader addSubview:upView];
//左側的view
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 80, 20, 280)];
leftView.alpha = 0.3;
leftView.backgroundColor = [UIColor blackColor];
[reader addSubview:leftView];
//右側的view
UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(300, 80, 20, 280)];
rightView.alpha = 0.3;
rightView.backgroundColor = [UIColor blackColor];
[reader addSubview:rightView];
//底部view
UIView * downView = [[UIView alloc] initWithFrame:CGRectMake(0, 360, 320, 120)];
downView.alpha = 0.3;
downView.backgroundColor = [UIColor blackColor];
[reader addSubview:downView];
//用于說明的label
UILabel * labIntroudction= [[UILabel alloc] init];
labIntroudction.backgroundColor = [UIColor clearColor];
labIntroudction.frame=CGRectMake((ScreenW - 280)*0.5,8, 280, 40);
labIntroudction.numberOfLines=2;
labIntroudction.textColor=[UIColor whiteColor];
labIntroudction.font = Font(15);
labIntroudction.text=@"將二維碼圖像置于矩形方框內";
labIntroudction.textAlignment = NSTextAlignmentCenter;
[downView addSubview:labIntroudction];
/*
//用于取消操作的button 可有可無
UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
cancelButton.alpha = 0.4;
[cancelButton setFrame:CGRectMake(20, 390, 280, 40)];
[cancelButton setTitle:@"將二維碼圖像置于矩形方框內" forState:UIControlStateNormal];
[cancelButton.titleLabel setFont:[UIFont boldSystemFontOfSize:20]];
[cancelButton addTarget:self action:@selector(dismissOverlayView:)forControlEvents:UIControlEventTouchUpInside];
[reader addSubview:cancelButton];
*/
}
總結
倆種方式都挺簡單的凤薛,建議用自定義的,因為靈活 漂亮诞仓。