iOS端使用二維碼掃描(ZBarSDK)和生成(libqrencode)功能


 

如今二維碼隨處可見,無論是實物商品還是各種禮券都少不了二維碼的身影。手機中二維碼使用也很廣泛,如微信等。正好最近收集總結了下二維碼的使用方法

下面介紹一下如何在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

[cpp]   view plain  copy
 
  1. id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];  
  2.   ZBarSymbol *symbol = nil;  
  3.   for(symbol in results)  
  4.       break;      
  5.   [self dismissViewControllerAnimated:YES  
  6.                            completion:^{  
  7.                            }];  
  8. NSString *code = [NSString stringWithString:symbol.data];  

⑧ 實現開始掃描的按鈕功能

[cpp]   view plain  copy
 
  1. ZBarReaderViewController *reader = [ZBarReaderViewController new];  
  2.   reader.readerDelegate = self;  
  3. reader.supportedOrientationsMask = ZBarOrientationMaskAll;  
  4.       
  5.   ZBarImageScanner *scanner = reader.scanner;  
  6.   [scanner setSymbology: ZBAR_I25  
  7.                  config: ZBAR_CFG_ENABLE  
  8.                      to: 0];  
  9.   [self presentViewController:reader  
  10.                      animated:YES  
  11.                    completion:^{  
  12.   }];  

 

 2.生成二維碼

在生成二維碼的庫中QREncoder最為常見,但是由於中文字符的特殊性,生成中文的時候會出現一定的錯誤,所以博主改用libqrencode,是一個純C編寫的類庫,支持面也更廣泛。

① 下載libqrencode源碼;

② 在新工程中導入以下框架:AVFoundation.framework、CoreMedia.framework、CoreVideo.framework、QuartzCore.framework、libiconv.dylib(已存在則不需要重新加入);

③ 將libqrencode源碼加入工程;

④ 需要使用的頁面.m文件中引用頭文件#import "QRCodeGenerator.h";

⑤ 實現生成二維碼圖片的方法

[cpp]   view plain  copy
 
  1. UIImage *image = [QRCodeGenerator qrImageForString:self.codeString imageSize:self.imageView_Code.bounds.size.width];  

3.自定義掃描頁

ZXing支持自己創建掃描頁面,而由於ZBar使用的.a的鏈接庫文件,所以需要修改他生成的掃描頁,不能直接新建一個。

在上文中掃描二維碼第⑧項,對reader進行一些修改,代碼如下:

[cpp]   view plain  copy
 
  1. for (UIView *temp in [reader.view subviews]) {  
  2.         for (UIToolbar *toolbar in [temp subviews]) {  
  3.             if ([toolbar isKindOfClass:[UIToolbar class]])  
  4.             {  
  5.                 UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissOverlayView:)];  
  6.                   
  7.                 UIBarButtonItem *item2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];  
  8.                   
  9.                 UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithTitle:@"相冊" style:UIBarButtonItemStyleBordered target:self action:@selector(clickPhotoToolBarItem:)];  
  10.                 NSArray *array = [NSArray arrayWithObjects:item1,item2,item3,nil];  
  11.                   
  12.                 [toolbar setItems:array animated:YES];  
  13.             }  
  14.         }  
  15.     }    
上述代碼中,取消按鈕和相冊按鈕方法等需要自己定義。方法中詳細代碼如下:
[cpp]   view plain  copy
 
  1. //取消按鈕方法  
  2. - (void)dismissOverlayView:(id)sender{  
  3.     [self dismissViewControllerAnimated:YES  
  4.                              completion:^{  
  5.     }];  
  6. }  
  7. // 選取相冊  
  8. -(void)clickPhotoToolBarItem:(id)sender  
  9. {  
  10.     if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])  
  11.     {  
  12.         UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];  
  13.         imagePicker.delegate = self;  
  14.         imagePicker.allowsEditing = NO;  
  15.         imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  16.           
  17.         [self dismissViewControllerAnimated:NO completion:^{}];  
  18.         [self presentViewController:imagePicker animated:YES completion:^{}];  
  19.     }  
  20. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM