• 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. }  
  • 相关阅读:
    C++关键字 inline
    MySQL之Join
    leetcode:Isomorphic Strings
    vs中常用的快捷键
    size_t 和 size_type的区别
    使用max函数计算EXCEL个税公式
    什么是数组?
    作业题:输入4个整数,找出其中最大的数。用一个函数来实现. 分别使用结构化方法和函数嵌套的方法。
    c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?
    Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别
  • 原文地址:https://www.cnblogs.com/496668219long/p/4655571.html
Copyright © 2020-2023  润新知