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
- 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)功能的更多相关文章
- iOS:原生二维码扫描
做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framewo ...
- iOS学习——iOS原生实现二维码扫描
最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...
- iOS学习之二维码扫描
这几天刚好将本人高仿新浪微博的事情进行一个阶段性的tag,在此也将这个项目在实现二维码扫描这个功能来做一个简要的记录.关于高仿新浪微博的源代码,本人已经将全部代码托管到github,地址在这里.欢迎大 ...
- iOS开发技术 - 二维码扫描、生成
QRecLevel:QR_ECLEVEL_H // 二维码容错率,最高为30%(即QR_ECLEVEL_H),即LOGO有大 ...
- iOS 自带二维码扫描功能的实现
自从iOS7以后中新增了二维码扫描功能.因此可以在不借助第三方类库的情况下简单的写出二维码的扫描功能: 原生的二维码扫描功能在AVFoundation框架下,所以在使用原生的二维码扫描功能时要先导入A ...
- iOS开发之二维码扫描
二维码扫描 01-导入系统库 02 新建继承自UIView的 LHQPreView 2.1导入系统库头文件 #import <AVFoundation/AVFoundation.h> 2. ...
- bug: 使用 iOS 系统方法进行二维码扫描,扫描区域的问题
项目里用到了扫描,出现了bug:感觉就是把二维码正好框在扫描框里扫不出来,然后把镜头离二维码拉远,扫描速度很慢,但是能扫描出来.网上找了下代码,发现也没啥哪里不一样,感觉很坑啊,后面发现不设置 AVC ...
- 有关iOS系统中调用相机设备实现二维码扫描功能的注意点(3/3)
今天我们接着聊聊iOS系统实现二维码扫描的其他注意点. 大家还记得前面我们用到的输出数据的类对象吗?AVCaptureMetadataOutput,就是它!如果我们需要实现目前主流APP扫描二维码的功 ...
- iOS系统原生 二维码的生成、扫描和读取(高清、彩色)
由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维 ...
随机推荐
- 编译lua
http://www.lua.org/ 新建一个 static library 工程,把解压得到的目录下的src子目录中的所有.h和.c文件拷贝到新工程目录下. 工程中删除自动生成的 main.c 文 ...
- 电影TS/TC/SCR/R5/BD/HD/HC版本意思收集(转)
一.版本说明: 1.CAM(枪版) CAM通常是用数码摄像机从电影院盗录.有时会使用小三角架,但大多数时候不可能使用,所以摄像机会抖动.因此我们看到画面通常偏暗人物常常会失真,下方的 字幕时常会出现倾 ...
- Android 自定义录音、播放动画View,让你的录音浪起来
最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸. 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的 ...
- 转: 浅析Fusion-IO和Intel SSD
from: http://alanwu.blog.51cto.com/3652632/865235 标签:SSD 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- SPFA 求带负权的单源最短路
int spfa_bfs(int s) { ///s表示起点. queue <int> q; memset(d,0x3f,sizeof(d)); ///d数组中存下的就是最短路径(存在的话 ...
- AngularJS的ng-repeat显示表格
代码下载:https://files.cnblogs.com/files/xiandedanteng/angualrJSngRepeatTable.rar 代码: <!DOCTYPE HTML ...
- Ffmpeg 实现文件切割
文件切割是一项很常见的基本功能,通过Ffmpeg可以很容易实现这项功能. 首先介绍下基本原理,文件切割说白了就过滤掉文件的部分音视频包,按照什么规则过滤呢? 答案是时间戳.文件中每个视频及音频包都有时 ...
- vim 模式切换
1. 从插入模式退回到normal模式 <esc> <C-c> <C-[>
- python--函数程序分析
写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作 import os #加载模块 def xiu(a,b,c): #三个接受值的形参 f = open(a,encod ...
- Jquery 文字模拟输入效果
https://github.com/mattboldt/typed.js/ 挺酷炫的