最近項目里需要做一個掃描以及相冊識別的功能榜旦,上網(wǎng)找了挺久的? 發(fā)現(xiàn)都是用的系統(tǒng)自帶的AVCaptureSessionAPI肚邢,雖然系統(tǒng)自帶的比較簡單方便,但是用有一個問題就是掃描的時候可以滿足二維/條形碼篡九,到了相冊識別的時候卻只能識別到二維碼,對于條形碼就無法識別了醋奠。所以最后找到了ZbarSDK,這樣就可以同時滿足相冊掃描二維/條形碼的需求了榛臼。
ZbarSDK最新的支持64位的下載請點擊http://download.csdn.net/download/qq_28643245/8759313
好了 SDK下載下來之后就用最簡單的方法直接拖進工程吧
接下來就是添加伊佃。a文件了
當然zbarsdk在pod上是有托管的,我們可以用cocoapods自己導入沛善;
pod search zbarsdk
修改podfile航揉,加入pod 'ZBarSDK', '~> 1.3.1'
pod install
對于不熟悉cocoapods的人,可以去下載別人編譯好的libzbar.a文件和它的頭文件金刁。
使用方法如下:
導入相關(guān)frameworks:“AVFoundation.framwork, CoreMedia.framework, CoreVideo.framework, libiconv.tbd”(對于pod導入的帅涂,略去這步,pod自己會配置好)
在使用的掃碼的控制器中引入#進口“ZBarSDK.h”頭文件尤蛮,就可以使用了值得一提的是媳友,通過提供的SDK我們可以看到,产捞。zbar和SDK提供了兩種使用方式:1 )直接調(diào)用?ZBarReaderViewController打開一個掃描界面?; 2)ZBar SDK提供的可以嵌入其他視圖的ZBarReaderView(建議使用該方法醇锚,我們可以自定義掃描界面,我們后面定制掃描的頁面就是通過這種方式)坯临。
第一種方式是常規(guī)的方式焊唬,通過?ZBarReaderViewController直接打開一個掃描界面進行掃描。首先引用頭文件?#import“ZBarSDK.h”看靠,實現(xiàn)代理?初始化掃描二維碼控制器
這里我們直接從第二種自定義掃描界面開始
/ **
?*自定義掃描二維碼視圖樣式
?* @ param初始化掃描二維碼視圖的子控件
?* /??
- (void?)configuredZBarReaderMaskView {??
//掃描的矩形方框視圖??
_qrRectView = [[QRView?alloc?]?init?];??
_qrRectView?.transparentArea??= CGSizeMake(2?2?0?赶促,?2?2?0?);??
_qrRectView?.backgroundColor?= [UIColor?clearColor?];??
[_readview?addSubview?:_qrRectView];??
[_qrRectView?mas_makeConstraints?:^(MASConstraintMaker??* make){??
????????使.TOP?.equalTo?(_readview)?。隨著.offset?(0?);??
make?.left?.equalTo?(_readview).with?.offset?(0?);??
make?.right?.equalTo?(_readview).with?.offset?(0?);??
make?.bottom?.equalTo?(_readview).with?.offset?(0?);??
????}];??
//照明按鈕??
_lightingBtn = [UIButton?buttonWithType?:UIButtonTypeCustom];??
[_lightingBtn?setTitle?:@“照明”?forState?:UIControlStateNormal];??
[_lightingBtn?.titleLabel??setfont程序:[UIFont?systemFontOfSize?:1?4?]];??
_lightingBtn?.layer?.borderColor?= [UIColor?colorWithHexString?:@“#3498db”?]?.CGColor?;??
_lightingBtn?.layer?.borderWidth?=?1?0.0?;??
_lightingBtn?.layer?.cornerRadius?=?8?0.0?;??
[_lightingBtn?setTitleEdgeInsets?:UIEdgeInsetsMake(0?挟炬,?2?0?芳杏,?0?,?0?)];??
[_lightingBtn?setTitleColor?:[UIColor?whiteColor?]?forState?:UIControlStateNormal];??
[_lightingBtn?setBackgroundColor?:[UIColor?clearColor?]];??
_lightingBtn?.tag??= LIGHTBUTTONTAG;??
[_lightingBtn?addTarget?:自?動作:@selector?(buttonClicked :)?forControlEvents?:UIControlEventTouchUpInside];??
[_qrRectView?addSubview?:_lightingBtn];??
[_lightingBtn?mas_makeConstraints?:^(MASConstraintMaker??* make){??
make?.bottom?.equalTo?(_qrRectView).with?.offset?( -?1?0?0?);??
make?.centerX?.equalTo?(_qrRectView);??
????????使.size?.mas_equalTo?(CGSizeMake(8?8?辟宗,?2?8?));??
????}];??
UIImageView?* lightImage = [[UIImageView?alloc?]?init?];??
lightImage?.image?= [UIImage?imageNamed?:@“bulb”?];??
[_lightingBtn?addSubview?:lightImage];??
[lightImage?mas_makeConstraints?:^(MASConstraintMaker??* make){??
make?.centerY?.equalTo?(_lightingBtn);??
make?.left?.equalTo?(_lightingBtn).with?.offset?(1?7?);??
make?.width?.equalTo?(@ 22?);??
make?.height?.equalTo?(@ 22?);??
????}];??
//導入二維碼圖片??
_importQRCodeImageBtn = [UIButton?buttonWithType?:UIButtonTypeCustom];??
[_importQRCodeImageBtn?setTitle?:@“導入二維碼”?forState?:UIControlStateNormal];??
[_importQRCodeImageBtn?.titleLabel??setfont程序:[UIFont?systemFontOfSize?:1?2?]];??
[_importQRCodeImageBtn?setTitleColor?:[UIColor?whiteColor?]?forState?:UIControlStateNormal];??
[_importQRCodeImageBtn?setBackgroundColor?:[UIColor?clearColor?]];??
_importQRCodeImageBtn?.tag??= IMPORTBUTTONTAG;??
[_importQRCodeImageBtn?addTarget?:自?動作:@selector?(buttonClicked :)?forControlEvents?:UIControlEventTouchUpInside];??
[_qrRectView?addSubview?:_importQRCodeImageBtn];??
[_importQRCodeImageBtn?mas_makeConstraints?:^(MASConstraintMaker??* make){??
make?.bottom?.equalTo?(_qrRectView?.mas_bottom?).with?.offset?( -?3?2?);??
make?.right?.equalTo?(_qrRectView?.mas_right?).with?.offset?( -?2?0?);??
????????使.size?.mas_equalTo?(CGSizeMake(6?0?爵赵,?1?2?));??
????}];??
_importQRCodeImage = [UIButton?buttonWithType?:UIButtonTypeCustom];??
[_importQRCodeImage?setBackgroundImage?:[UIImage?imageNamed?:@“album”?]?forState?:UIControlStateNormal];??
_importQRCodeImage?.tag??= IMPORTBUTTONTAG;??
[_importQRCodeImage?addTarget?:自?動作:@selector?(buttonClicked :)?forControlEvents?:UIControlEventTouchUpInside];??
[_qrRectView?addSubview?:_importQRCodeImage];??
[_importQRCodeImage?mas_makeConstraints?:^(MASConstraintMaker??* make){??
make?.bottom?.equalTo?(_qrRectView).with?.offset?( -?4?8?);??
make?.centerX?.equalTo?(_importQRCodeImageBtn);??
????????使.size?.mas_equalTo?(CGSizeMake(3?2?,?3?2?));??
????}];??
}??
控件事件處理
- (void?)buttonClicked :(?UIButton??*)sender {??
開關(guān)(sender?.tag?){??
案例LIGHTBUTTONTAG?://照明按鈕??
????????{??
if?(0?泊脐!= _readview?.torchMode?){??
//關(guān)閉閃光燈??
_readview?.torchMode?=?0?;??
}?else?if??(0?== _readview?.torchMode?){???
//打開閃光燈??
_readview?.torchMode?=?1?;??
????????????}??
????????}??
打破;??
案例IMPORTBUTTONTAG?://導入二維碼圖片??
????????{??
[?self?presentImagePickerController?];??
????????}??
打破;??
?默認:??
打破;??
????}??
}??
/ **
?*打開二維碼掃描視圖ZBarReaderView
?* @ param關(guān)閉閃光燈
?* /??
- (void?)setZBarReaderViewStart {??
_readview?.torchMode?=?0?;?//關(guān)閉閃光燈??
[_readview?start?];?//開始掃描二維碼??
[_qrRectView?startScan?];??
}??
/ **
?*關(guān)閉二維碼掃描視圖ZBarReaderView
?* @ param關(guān)閉閃光燈
?* /??
- (void?)setZBarReaderViewStop {??
_readview?.torchMode?=?0?;?//關(guān)閉閃光燈??
[_readview?stop?];?//關(guān)閉掃描二維碼??
[_qrRectView?stopScan?];??
}??
//彈出系統(tǒng)相冊空幻,相機??
- (void?)presentImagePickerController {??
????UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypePhotoLibrary;??
_picker = [[UIImagePickerController?alloc?]?init?];??
_picker?.sourceType????????????????= sourceType;??
_picker?.allowsEditing?=?YES?;??
// NSArray * temp_MediaTypes = [UIImagePickerController availableMediaTypesForSourceType:picker.sourceType];??
// picker.mediaTypes = temp_MediaTypes;??
_picker?.delegate?=?self?;??
UIWindow?* window = [UIApplication?sharedApplication?]?.keyWindow?;??
[window?addSubview?:_picker?.view?];??
[_picker?.view?mas_makeConstraints?:^(MASConstraintMaker??* make){??
make?.center?.equalTo?(window);??
????????使.size?.equalTo?(窗口);??
????}];??
}??
- (void?)imagePickerControllerDidCancel :(?UIImagePickerController??*)picker?{??
//收起相冊??
[?picker .view?removeFromSuperview?];??
}??
*最關(guān)鍵的步驟就是掃描二維碼獲取二維碼內(nèi)容和從相冊導入二維碼圖片獲取二維碼內(nèi)容
#pragma標記 -???
#pragma標記ZBarReaderViewDelegate??
//掃描二維碼的時候,識別成功會進入此方法容客,讀取二維碼內(nèi)容??
- (void?)readerView?:(ZBarReaderView *)readerView??
didReadSymbols?:(ZBarSymbolSet *)符號??
fromImage?:(UIImage *)image {??
//停止掃描??
[?self?setZBarReaderViewStop?];??
ZBarSymbol?* symbol =?nil?;??
for??(symbol in symbol){??
打破;??
????}??
NSString?* urlStr = symbol?.data?;??
if?(urlStr ==?nil?|| urlStr?.length?<=?0?){??
//二維碼內(nèi)容解析失敗??
UIAlertController?* alertVC = [UIAlertController?alertControllerWithTitle?:@“掃描失敗”??消息:nil?preferredStyle?:UIAlertControllerStyleAlert];??
????????__weak __typeof(self?)weakSelf =?self?;??
UIAlertAction?* action = [UIAlertAction?actionWithTitle?:@“確定”?style?:UIAlertActionStyleCancel?handler?:^(UIAlertAction??* action){??
//重新掃描??
[weakSelf?setZBarReaderViewStart?];??
????????}];??
[alertVC?addAction?:action];??
[?自我presentViewController?:alertVC??動畫:是?完成:^ {??
????????}];??
返回;??
????}??
????NSLog(@“urlStr:%@”?秕铛,urlStr);??
//二維碼掃描成功,彈窗提示??
UIAlertController?* alertVC = [UIAlertController?alertControllerWithTitle?:@“掃描成功”??消息:[NSString?stringWithFormat?:@“二維碼內(nèi)容:\ n%@”?缩挑,urlStr]?preferredStyle?:UIAlertControllerStyleAlert];??
????__weak __typeof(self?)weakSelf =?self?;??
UIAlertAction?* action = [UIAlertAction?actionWithTitle?:@“確定”?style?:UIAlertActionStyleCancel?handler?:^(UIAlertAction??* action){??
//繼續(xù)掃描??
[weakSelf?setZBarReaderViewStart?];??
????}];??
[alertVC?addAction?:action];??
[?自我presentViewController?:alertVC??動畫:是?完成:^ {??
????}];??
}??
#pragma標記 -???
#pragma標記UIImagePickerControllerDelegate??
//導入二維碼的時候會進入此方法但两,處理選中的相片獲取二維碼內(nèi)容??
- (void?)imagePickerController :(?UIImagePickerController?*?)picker?didFinishPickingMediaWithInfo?:(?NSDictionary??*)info {??
//停止掃描??
[?self?setZBarReaderViewStop?];??
//處理選中的相片,獲得二維碼里面的內(nèi)容??
ZBarReaderController?* reader = [[ZBarReaderController?alloc?]?init?];??
UIImage?* image = [info?objectForKey?:UIImagePickerControllerOriginalImage];??
CGImageRef cgimage = image?.CGImage?;??
ZBarSymbol?* symbol =?nil?;??
for?(在[reader?readerImage?:cgimage]中的符號)??
打破;??
NSString?* urlStr = symbol?.data?;??
[?picker .view?removeFromSuperview?];??
if?(urlStr ==?nil?|| urlStr?.length?<=?0?){??
//二維碼內(nèi)容解析失敗??
UIAlertController?* alertVC = [UIAlertController?alertControllerWithTitle?:@“掃描失敗”??消息:nil?preferredStyle?:UIAlertControllerStyleAlert];??
????????__weak __typeof(self?)weakSelf =?self?;??
UIAlertAction?* action = [UIAlertAction?actionWithTitle?:@“確定”?style?:UIAlertActionStyleCancel?handler?:^(UIAlertAction??* action){??
//重新掃描??
[weakSelf?setZBarReaderViewStart?];??
????????}];??
[alertVC?addAction?:action];??
[?自我presentViewController?:alertVC??動畫:是?完成:^ {??
????????}];??
返回;??
????}??
????NSLog(@“urlStr:%@”?供置,urlStr);??
//二維碼掃描成功谨湘,彈窗提示??
UIAlertController?* alertVC = [UIAlertController?alertControllerWithTitle?:@“掃描成功”??消息:[NSString?stringWithFormat?:@“二維碼內(nèi)容:\ n%@”?,urlStr]?preferredStyle?:UIAlertControllerStyleAlert];??
????__weak __typeof(self?)weakSelf =?self?;??
UIAlertAction?* action = [UIAlertAction?actionWithTitle?:@“確定”?style?:UIAlertActionStyleCancel?handler?:^(UIAlertAction??* action){??
//繼續(xù)掃描??
[weakSelf?setZBarReaderViewStart?];??
????}];??
[alertVC?addAction?:action];??
[?自我presentViewController?:alertVC??動畫:是?完成:^ {??
????}];??
項目演示已經(jīng)放在GitHub,也算是做了一個小結(jié)紧阔。https?://github.com/jaybinhe/JB_ZBarSDK_Demo