如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影。手机中二维码使用也很广泛,如微信等。正好最近收集总结了下二维码的使用方法

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

  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];

⑧ 实现开始扫描的按钮功能

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

2.生成二维码

在生成二维码的库中QREncoder最为常见,但是由于中文字符的特殊性,生成中文的时候会出现一定的错误,所以博主改用libqrencode,是一个纯C编写的类库,支持面也更广泛。

① 下载libqrencode源码;

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

③ 将libqrencode源码加入工程;

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

⑤ 实现生成二维码图片的方法

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

3.自定义扫描页

ZXing支持自己创建扫描页面,而由于ZBar使用的.a的链接库文件,所以需要修改他生成的扫描页,不能直接新建一个。

在上文中扫描二维码第⑧项,对reader进行一些修改,代码如下:

  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. UIBarButtonItem *item2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
  7. UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithTitle:@"相册" style:UIBarButtonItemStyleBordered target:self action:@selector(clickPhotoToolBarItem:)];
  8. NSArray *array = [NSArray arrayWithObjects:item1,item2,item3,nil];
  9. [toolbar setItems:array animated:YES];
  10. }
  11. }
  12. }

上述代码中,取消按钮和相册按钮方法等需要自己定义。方法中详细代码如下:

  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. [self dismissViewControllerAnimated:NO completion:^{}];
  17. [self presentViewController:imagePicker animated:YES completion:^{}];
  18. }
  19. }

iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能的更多相关文章

  1. iOS:原生二维码扫描

    做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framewo ...

  2. iOS学习——iOS原生实现二维码扫描

    最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...

  3. iOS学习之二维码扫描

    这几天刚好将本人高仿新浪微博的事情进行一个阶段性的tag,在此也将这个项目在实现二维码扫描这个功能来做一个简要的记录.关于高仿新浪微博的源代码,本人已经将全部代码托管到github,地址在这里.欢迎大 ...

  4. iOS开发技术 - 二维码扫描、生成

    QRecLevel:QR_ECLEVEL_H // 二维码容错率,最高为30%(即QR_ECLEVEL_H),即LOGO有大                                       ...

  5. iOS 自带二维码扫描功能的实现

    自从iOS7以后中新增了二维码扫描功能.因此可以在不借助第三方类库的情况下简单的写出二维码的扫描功能: 原生的二维码扫描功能在AVFoundation框架下,所以在使用原生的二维码扫描功能时要先导入A ...

  6. iOS开发之二维码扫描

    二维码扫描 01-导入系统库 02 新建继承自UIView的 LHQPreView 2.1导入系统库头文件 #import <AVFoundation/AVFoundation.h> 2. ...

  7. bug: 使用 iOS 系统方法进行二维码扫描,扫描区域的问题

    项目里用到了扫描,出现了bug:感觉就是把二维码正好框在扫描框里扫不出来,然后把镜头离二维码拉远,扫描速度很慢,但是能扫描出来.网上找了下代码,发现也没啥哪里不一样,感觉很坑啊,后面发现不设置 AVC ...

  8. 有关iOS系统中调用相机设备实现二维码扫描功能的注意点(3/3)

    今天我们接着聊聊iOS系统实现二维码扫描的其他注意点. 大家还记得前面我们用到的输出数据的类对象吗?AVCaptureMetadataOutput,就是它!如果我们需要实现目前主流APP扫描二维码的功 ...

  9. iOS系统原生 二维码的生成、扫描和读取(高清、彩色)

    由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维 ...

随机推荐

  1. 邁向IT專家成功之路的三十則鐵律 鐵律二:IT專家專業之道–專精

    在IT技術的領域當中有許多的類別,若要細分那可真是難以一一列舉,但常見的大致有軟體研發工程師.韌體研發工程師.系統分析師.網路工程師.系統工程師.維護工程師.動畫設計師.製圖工程師.以及各類別的專業電 ...

  2. Oracle 11g客户端

    资源 下载资源,直接解压进行配置 Oracle官方资源:http://www.oracle.com/technetwork/database/features/instant-client/index ...

  3. SilverLight:基础控件使用(4)-日期显示和选择类控件

    ylbtech-SilverLight-Basic-Control:基础控件使用(4)-日期显示和选择类控件 Calendar,DatePicker 1.A,返回顶部 Calendar控件(日期控件) ...

  4. mac git安装及github配置

    准备下载一个react的demo程序包,需要本地用到git.早就向配置了,那就安装配置一下吧. 首先,原来mac已经安装了git,版本 2.7 ,我用 brew又安装了一份git 版本 2.10.2. ...

  5. Win7/Win2008下IIS配置Asp网站启用父路径的设置方法(已解决)

    Win7/Win2008下IIS配置Asp网站启用父路径的设置方法(已解决) 在Win7/Win2008下IIS配置Asp网站启用父路径的设置方法与win2003下不同,看看下图就知道了.

  6. 改变其他iframe的src

    window.parent.$("#ifr").location="????";);来改变

  7. (学习笔记3)BMP位图的读取与显示

    在(学习笔记2)中.我们已经具体说明怎样去创建MFC.在这节中.主要解决BMP位图照片的读取和显示问题. 我们新建一个projectdemo1.创建步骤请看(学习笔记2)中具体说明. 创建成功后,例如 ...

  8. ios You app information could not be saved. Try again. If the problem persists, contact us

    ios You app information could not be saved. Try again. If the problem persists, contact us  大概意思:你的a ...

  9. 【足迹C++primer】39、动态内存与智能指针(3)

    动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...

  10. [Node.js] 關於 console.log 的格式化輸出

    Node.js 當中的 console.log,除了基本字串的輸出之外,還可以利用 %s.%d.%j 格式化的輸出,就讓我們來看些例子吧! 一.範例1 (字串輸出):console.js consol ...