IOSApp掃描二維/條形碼和相冊識別條形/二維碼以及集成使用中遇到的一些問題

最近項目里需要做一個掃描以及相冊識別的功能榜旦,上網(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坊罢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子擅耽,更是在濱河造成了極大的恐慌活孩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乖仇,死亡現(xiàn)場離奇詭異憾儒,居然都是意外死亡,警方通過查閱死者的電腦和手機乃沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門起趾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來互婿,“玉大人挠锥,你說我怎么就攤上這事∥涓#” “怎么了冷蚂?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵缭保,是天一觀的道長。 經(jīng)常有香客問我蝙茶,道長艺骂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任隆夯,我火速辦了婚禮钳恕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹄衷。我一直安慰自己忧额,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布愧口。 她就那樣靜靜地躺著睦番,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耍属。 梳的紋絲不亂的頭發(fā)上托嚣,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音厚骗,去河邊找鬼示启。 笑死,一個胖子當著我的面吹牛领舰,可吹牛的內(nèi)容都是我干的夫嗓。 我是一名探鬼主播迟螺,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啤月!你這毒婦竟也來了煮仇?” 一聲冷哼從身側(cè)響起劳跃,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谎仲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刨仑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郑诺,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年杉武,在試婚紗的時候發(fā)現(xiàn)自己被綠了辙诞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡轻抱,死狀恐怖飞涂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祈搜,我是刑警寧澤较店,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站容燕,受9級特大地震影響梁呈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蘸秘,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一官卡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧醋虏,春花似錦寻咒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粘舟,卻和暖如春熔脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柑肴。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工霞揉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晰骑。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓适秩,卻偏偏與公主長得像绊序,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秽荞,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容