二維碼生成
二維碼生成用到的是libqrencode
,這個(gè)庫(kù)是用C語(yǔ)言實(shí)現(xiàn)的,在使用的時(shí)候需要#import "QRCodeGenerator.h"
,這個(gè)類是對(duì)C實(shí)現(xiàn)代碼的封裝师脂,方便iOS開(kāi)發(fā)者使用.
生成二維碼只要下面一句代碼即可
UIImage *codeImage = [QRCodeGenerator qrImageForString:@"codeString" imageSize:size];
另外在QRCodeGenerator.m
文件中,看到了這個(gè)方法,
QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive)
level
這個(gè)參數(shù)指定生成的二維碼的質(zhì)量,質(zhì)量越高,越容易被掃描
version
這個(gè)參數(shù)決定了二維碼圖片中單位點(diǎn)的大小,值越大,單位點(diǎn)越小,看起來(lái)點(diǎn)也就越密集,一般設(shè)置成5左右
需要注意的地方
- 生成二維碼的圖片會(huì)比指定的size要小一些
- 暫時(shí)沒(méi)有找到設(shè)置二維碼圖片顏色的地方,可以使用
UIImage
的imageWithRenderingMode:
方法來(lái)實(shí)現(xiàn) - 如果需要在二維碼中添加logo等,暫時(shí)的方法是在二維碼上添加一個(gè)
UIImageView
二維碼掃描
二維碼掃描用到的是ZBar
需要引入幾個(gè)系統(tǒng)的框架CoreMedia.framework
第煮,AVFoundation.framework
绳姨,libiconv.tbd
使用ZBarReaderViewController
來(lái)實(shí)現(xiàn)掃描功能,一般我們使用自定義的類繼承ZBarReaderViewController
,在init
方法中而不是在viewDidLoad
方法中進(jìn)行初始化
- (void)setupContent
{
self.readerDelegate = self;
self.videoQuality = UIImagePickerControllerQualityTypeHigh;
self.supportedOrientationsMask = ZBarOrientationMaskAll;
//默認(rèn)底部有個(gè)工具欄职抡,把它隱藏掉凉泄,使用自己的View
self.showsZBarControls = NO;
self.showsCameraControls = NO;
//默認(rèn)是Auto比勉,設(shè)置成不開(kāi)啟閃光燈
self.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
//去除綠色的跟蹤框
self.tracksSymbols = NO;
//如果只掃描二維碼埋同,添加下面2行代碼州叠,可提高性能,如果要掃描條形碼凶赁,則去掉下面的代碼
// ZBarImageScanner *_scanner = self.scanner;
// [_scanner setSymbology:0 config:ZBAR_CFG_ENABLE to:0];
// [_scanner setSymbology:ZBAR_QRCODE config:ZBAR_CFG_ENABLE to:1];
//掃描界面顯示的View使用自定義的View咧栗,可以參考淘寶,京東的二維碼掃描界面
ScanView *scanView = [[ScanView alloc] initWithFrame:[UIScreen mainScreen].bounds];
scanView.delegate = self;
self.cameraOverlayView = scanView;
}
實(shí)現(xiàn)ZBarReaderDelegate
中的這個(gè)方法
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];
ZBarSymbol * symbol;
for(symbol in results)
break;
NSLog(@"二維碼數(shù)據(jù) : %@", symbol.data);
}
有時(shí)候需要解析照片中的二維碼虱肄,這種情況需要用到ZBarReaderController
這個(gè)類
- (void) scanViewSeletedPhoto
{
ZBarReaderController *reader = [ZBarReaderController new];
reader.allowsEditing = NO;
reader.showsHelpOnFail = NO;
reader.readerDelegate = self;
reader.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:reader animated:YES completion:nil];
}
在彈出選擇圖片的界面致板,如果右上角顯示的是cancel
而不是取消
,那么得為你的項(xiàng)目添加中文版本,Project
->Localizations
->Add
選擇圖片后咏窿,如果成功解析到圖片中的二維碼斟或,會(huì)同樣調(diào)用上面的那個(gè)委托方法
如果沒(méi)有解析到圖中的二維碼或者圖片中根本就沒(méi)有二維碼,那么解析失敗集嵌,會(huì)調(diào)用下面的方法
- (void) readerControllerDidFailToRead: (ZBarReaderController*) reader
withRetry: (BOOL) retry
{
[self dismissViewControllerAnimated:YES completion:^{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"沒(méi)有找到二維碼" message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil];
[alert show];
}];
}