標籤:
如今二維碼隨處可見,無論是實物商品還是各種禮券都少不了二維碼的身影。手機中二維碼使用也很廣泛,如等。正好最近收集總結了下二維碼的使用方法
下面介紹一下如何在iOS裝置上使用二維碼
首先在github上下載ZBar SDK
地址https://github.com/bmorton/ZBarSDK
然後將如下的相關類庫添加進去
AVFoundation.framwork, CoreMedia.framework, CoreVideo.framework, libiconv.dylib 和libzbar.a
接下來首先在.h檔案中引用
#import "ZBarSDK.h"
同時添加代理
ZBarReaderDelegate
1.掃描二維碼(包括讀取和解碼)
掃描二維碼的開源庫有很多如 ZBar、ZXing等。博主先嘗試了ZXing,豎屏的情況下ZXing沒有問題,但是似乎橫屏會出現錯位的情況。於是博主放棄ZXing,使用ZBar。
這裡要提一句,ZXing的開源做的比ZBar好,讀取和解碼速度也快,但是整合到自己的工程中是見痛苦的事情,不光是匯入整個Demo工程,設定也相對繁瑣,如果不是真的需要超高效能應用的開發人員,博主還是建議使用ZBar。
總的流程如下:
① 下載ZbarSDK,包含ZbarSDK標頭檔包、libzbar.a靜態連結庫檔案以及資源檔三部分;
② 在新工程中匯入以下架構:AVFoundation.framework、CoreMedia.framework、CoreVideo.framework、QuartzCore.framework、libiconv.dylib(已存在則不需要重新加入);
③ 將ZbarSDK加入工程;
④ 檢查libzbar.a連結庫是否正常,如果沒有自動連結,需要手動加入,如:
⑤ 在需要使用的頁面.h檔案中引用標頭檔#import "ZBarSDK.h"
⑥ 在需要使用的頁面.h中繼承 <ZBarReaderDelegate>協議
⑦ 在.m中實現協議的方法- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info
- id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
- ZBarSymbol *symbol = nil;
- for(symbol in results)
- break;
- [self dismissViewControllerAnimated:YES
- completion:^{
- }];
- NSString *code = [NSString stringWithString:symbol.data];
⑧ 實現開始掃描的按鈕功能
- ZBarReaderViewController *reader = [ZBarReaderViewController new];
- reader.readerDelegate = self;
- reader.supportedOrientationsMask = ZBarOrientationMaskAll;
-
- ZBarImageScanner *scanner = reader.scanner;
- [scanner setSymbology: ZBAR_I25
- config: ZBAR_CFG_ENABLE
- to: 0];
- [self presentViewController:reader
- animated:YES
- completion:^{
- }];
2.產生二維碼
在產生二維碼的庫中QREncoder最為常見,但是由於中文字元的特殊性,產生中文的時候會出現一定的錯誤,所以博主改用libqrencode,是一個純C編寫的類庫,支援面也更廣泛。
① 下載libqrencode源碼;
② 在新工程中匯入以下架構:AVFoundation.framework、CoreMedia.framework、CoreVideo.framework、QuartzCore.framework、libiconv.dylib(已存在則不需要重新加入);
③ 將libqrencode源碼加入工程;
④ 需要使用的頁面.m檔案中引用標頭檔#import "QRCodeGenerator.h";
⑤ 實現產生二維碼圖片的方法
- UIImage *image = [QRCodeGenerator qrImageForString:self.codeString imageSize:self.imageView_Code.bounds.size.width];
3.自訂掃描頁
ZXing支援自己建立掃描頁面,而由於ZBar使用的.a的連結庫檔案,所以需要修改他產生的掃描頁,不能直接建立一個。
在上文中掃描二維碼第⑧項,對reader進行一些修改,代碼如下:
- for (UIView *temp in [reader.view subviews]) {
- for (UIToolbar *toolbar in [temp subviews]) {
- if ([toolbar isKindOfClass:[UIToolbar class]])
- {
- UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissOverlayView:)];
-
- UIBarButtonItem *item2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
-
- UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithTitle:@"相簿" style:UIBarButtonItemStyleBordered target:self action:@selector(clickPhotoToolBarItem:)];
- NSArray *array = [NSArray arrayWithObjects:item1,item2,item3,nil];
-
- [toolbar setItems:array animated:YES];
- }
- }
- }
上述代碼中,取消按鈕和相簿按鈕方法等需要自己定義。方法中詳細代碼如下:
- //取消按鈕方法
- - (void)dismissOverlayView:(id)sender{
- [self dismissViewControllerAnimated:YES
- completion:^{
- }];
- }
- // 選取相簿
- -(void)clickPhotoToolBarItem:(id)sender
- {
- if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
- {
- UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
- imagePicker.delegate = self;
- imagePicker.allowsEditing = NO;
- imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
-
- [self dismissViewControllerAnimated:NO completion:^{}];
- [self presentViewController:imagePicker animated:YES completion:^{}];
- }
- }
iOS端使用二維碼掃描(ZBarSDK)和產生(libqrencode)功能