iOS平台 二维码生成和扫描
2015-05-20 18:50
411 查看
一、二维码的生成
二维码生成利用libqrencode库,此库有很强的中文字符串转二维码能力。
如果libqrencode库中没有QRCodeGenerator类。需要首先导入QRCodeGenerator类。
使用的时候。只需导入QRCodeGenerator类即可。
可能遇到的错误:C99等
解决方法:在QRCodeGenerator类中导入头文件
#import <UIKit/UIKit.h>
即可
二、二维码扫描
二维码扫描利用ZBar库实现。
引用库本身扫描效果此处略。
记录ZBar自定义扫描,上源码:
- (void)initScanView
{
_readview = [ZBarReaderView
new];
_readview.backgroundColor = [UIColor
clearColor];
_readview.frame =
CGRectMake(0,
0, self.view.frame.size.width,
self.view.frame.size.height);
_readview.readerDelegate =
self;
_readview.allowsPinchZoom =
YES;//使用手势变焦
_readview.trackingColor = [UIColor
clearColor];
_readview.torchMode =
NO;//关闭闪关灯
_readview.tracksSymbols =
NO;
_readview.showsFPS =
NO;//
显示帧率 YES
显示 NO 不显示
UIImage *hbImage=[UIImage
imageNamed:@"sao@2x"];
_scanZomeBack=[[UIImageView
alloc] initWithImage:hbImage];
//添加一个背景图片
CGRect mImagerect=CGRectMake((_readview.frame.size.width-200)/2.0,
(_readview.frame.size.height-200)/2.0,
200, 200);
[_scanZomeBack
setFrame:mImagerect];
_readview.scanCrop = [self
getScanCrop:mImagerect readerViewBounds:_readview.bounds];//将被扫描的图像的区域
#pragma warning 此扫描区域的父视图不是readView.
[_readview
addSubview:_scanZomeBack];
[_readview
addSubview:_readLineView];
[self.view
addSubview:_readview];
[_readview
start];
//仿微信扫描区域中间动态线
[self
scanLineView];
}
- (void)scanLineView
{
CGRect rect =
CGRectMake(_scanZomeBack.frame.origin.x,
_scanZomeBack.frame.origin.y,
_scanZomeBack.frame.size.width,
2);
if (_readLineView) {
[_readLineView
removeFromSuperview];
}
_readLineView = [[UIImageView
alloc] initWithFrame:rect];
[_readLineView
setImage:[UIImage
imageNamed:@"line"]];
[UIView
animateWithDuration:3.0
delay: 0.0
options:
UIViewAnimationOptionRepeat
animations:^{
//修改fream的代码写在这里
_readLineView.frame =CGRectMake(_scanZomeBack.frame.origin.x,
_scanZomeBack.frame.origin.y+_scanZomeBack.frame.size.height,
_scanZomeBack.frame.size.width,
2);
}
completion:^(BOOL finished){
}];
[_readview
addSubview:_readLineView];
}
#pragma mark 获取扫描区域
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds
{//rect的y和height决定了扫描区域的宽;rect的x和width决定了扫描区域的高。且点(x,y)和(宽高)成1:2关系.
CGFloat x,y,width,height;
x = (rect.origin.x+20) / readerViewBounds.size.width;
y = (rect.origin.y-40) / readerViewBounds.size.height;
width = (rect.size.width-40) / readerViewBounds.size.width;
height = (rect.size.height+80) / readerViewBounds.size.height;
return CGRectMake(x, y, width, height);
}
#pragma ZBarReaderViewDelegate
- (void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet
*)symbols fromImage:(UIImage *)image{
//
得到扫描的条码内容
const
zbar_symbol_t *symbol =
zbar_symbol_set_first_symbol(symbols.zbarSymbolSet);
NSString *symbolStr = [NSString
stringWithUTF8String:
zbar_symbol_get_data(symbol)];
if (zbar_symbol_get_type(symbol) ==
ZBAR_QRCODE) {
//
是否QR二维码
}
for (ZBarSymbol *symbol
in symbols) {
self.pShowEncode.text = symbol.data;
NSLog(@"data====%@",symbol.data);
break;
}
[readerView
stop];
[readerView removeFromSuperview];
}
注意点:
1. zbar使用过程中,如果多次打开摄像头扫描Qrcode,会出现memory leak
problem, 导致其内存指数型增长,大概8次调用后即耗费了85M 左右的内存, 最后导致app崩溃
解决方法:
mem leak 问题的解决。
找到ZBarReaderViewController.m 修改其loadView方法,改成如下形式。
- (void) loadView
{
self.view =
[[[UIView alloc]
initWithFrame: CGRectMake (0 , 0 , 320 , 480 )] autorelease ];
}
添加了autorelease之后, 其内存使用状况就可以稳定在0.1M的范围内
[align=left]参考来源:http://www.cnblogs.com/ToDoToTry/p/3986366.html[/align]
2.64位中出现的扫描区域的蓝色边框
解决方法: 自己找到源码
然后找到下面图片里面的代码 改成这个:cropLayer.borderColor =
[UIColor clearColor].CGColor;
,然后再打个.a就好了。
3.蓝色边框不要过早删除,我们可以先参考蓝色边框确定扫描区域。之后再删除。
4.修改扫描区域的时候,注意rect的y和height决定了扫描区域的宽;rect的x和width决定了扫描区域的高。且点(x,y)和(宽高)成1:2关系
5.
三、添加扫描区域透明其他黑色半透明背景视图
类似QQ获取头像背景
利用
CAShapeLayer
和贝塞尔曲线实现此种背景。
参考来源:http://blog.csdn.net/zz_mm/article/details/42804671
二维码生成利用libqrencode库,此库有很强的中文字符串转二维码能力。
如果libqrencode库中没有QRCodeGenerator类。需要首先导入QRCodeGenerator类。
使用的时候。只需导入QRCodeGenerator类即可。
可能遇到的错误:C99等
解决方法:在QRCodeGenerator类中导入头文件
#import <UIKit/UIKit.h>
即可
二、二维码扫描
二维码扫描利用ZBar库实现。
引用库本身扫描效果此处略。
记录ZBar自定义扫描,上源码:
- (void)initScanView
{
_readview = [ZBarReaderView
new];
_readview.backgroundColor = [UIColor
clearColor];
_readview.frame =
CGRectMake(0,
0, self.view.frame.size.width,
self.view.frame.size.height);
_readview.readerDelegate =
self;
_readview.allowsPinchZoom =
YES;//使用手势变焦
_readview.trackingColor = [UIColor
clearColor];
_readview.torchMode =
NO;//关闭闪关灯
_readview.tracksSymbols =
NO;
_readview.showsFPS =
NO;//
显示帧率 YES
显示 NO 不显示
UIImage *hbImage=[UIImage
imageNamed:@"sao@2x"];
_scanZomeBack=[[UIImageView
alloc] initWithImage:hbImage];
//添加一个背景图片
CGRect mImagerect=CGRectMake((_readview.frame.size.width-200)/2.0,
(_readview.frame.size.height-200)/2.0,
200, 200);
[_scanZomeBack
setFrame:mImagerect];
_readview.scanCrop = [self
getScanCrop:mImagerect readerViewBounds:_readview.bounds];//将被扫描的图像的区域
#pragma warning 此扫描区域的父视图不是readView.
[_readview
addSubview:_scanZomeBack];
[_readview
addSubview:_readLineView];
[self.view
addSubview:_readview];
[_readview
start];
//仿微信扫描区域中间动态线
[self
scanLineView];
}
- (void)scanLineView
{
CGRect rect =
CGRectMake(_scanZomeBack.frame.origin.x,
_scanZomeBack.frame.origin.y,
_scanZomeBack.frame.size.width,
2);
if (_readLineView) {
[_readLineView
removeFromSuperview];
}
_readLineView = [[UIImageView
alloc] initWithFrame:rect];
[_readLineView
setImage:[UIImage
imageNamed:@"line"]];
[UIView
animateWithDuration:3.0
delay: 0.0
options:
UIViewAnimationOptionRepeat
animations:^{
//修改fream的代码写在这里
_readLineView.frame =CGRectMake(_scanZomeBack.frame.origin.x,
_scanZomeBack.frame.origin.y+_scanZomeBack.frame.size.height,
_scanZomeBack.frame.size.width,
2);
}
completion:^(BOOL finished){
}];
[_readview
addSubview:_readLineView];
}
#pragma mark 获取扫描区域
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds
{//rect的y和height决定了扫描区域的宽;rect的x和width决定了扫描区域的高。且点(x,y)和(宽高)成1:2关系.
CGFloat x,y,width,height;
x = (rect.origin.x+20) / readerViewBounds.size.width;
y = (rect.origin.y-40) / readerViewBounds.size.height;
width = (rect.size.width-40) / readerViewBounds.size.width;
height = (rect.size.height+80) / readerViewBounds.size.height;
return CGRectMake(x, y, width, height);
}
#pragma ZBarReaderViewDelegate
- (void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet
*)symbols fromImage:(UIImage *)image{
//
得到扫描的条码内容
const
zbar_symbol_t *symbol =
zbar_symbol_set_first_symbol(symbols.zbarSymbolSet);
NSString *symbolStr = [NSString
stringWithUTF8String:
zbar_symbol_get_data(symbol)];
if (zbar_symbol_get_type(symbol) ==
ZBAR_QRCODE) {
//
是否QR二维码
}
for (ZBarSymbol *symbol
in symbols) {
self.pShowEncode.text = symbol.data;
NSLog(@"data====%@",symbol.data);
break;
}
[readerView
stop];
[readerView removeFromSuperview];
}
注意点:
1. zbar使用过程中,如果多次打开摄像头扫描Qrcode,会出现memory leak
problem, 导致其内存指数型增长,大概8次调用后即耗费了85M 左右的内存, 最后导致app崩溃
解决方法:
mem leak 问题的解决。
找到ZBarReaderViewController.m 修改其loadView方法,改成如下形式。
- (void) loadView
{
self.view =
[[[UIView alloc]
initWithFrame: CGRectMake (0 , 0 , 320 , 480 )] autorelease ];
}
添加了autorelease之后, 其内存使用状况就可以稳定在0.1M的范围内
[align=left]参考来源:http://www.cnblogs.com/ToDoToTry/p/3986366.html[/align]
2.64位中出现的扫描区域的蓝色边框
解决方法: 自己找到源码
然后找到下面图片里面的代码 改成这个:cropLayer.borderColor =
[UIColor clearColor].CGColor;
,然后再打个.a就好了。
3.蓝色边框不要过早删除,我们可以先参考蓝色边框确定扫描区域。之后再删除。
4.修改扫描区域的时候,注意rect的y和height决定了扫描区域的宽;rect的x和width决定了扫描区域的高。且点(x,y)和(宽高)成1:2关系
5.
三、添加扫描区域透明其他黑色半透明背景视图
类似QQ获取头像背景
利用
CAShapeLayer
和贝塞尔曲线实现此种背景。
参考来源:http://blog.csdn.net/zz_mm/article/details/42804671
相关文章推荐
- 【iOS开发】ZBar的使用:二维码的生成及扫描 —— 伊禾媛
- iOS开发日记13-原生二维码的扫描和生成
- iOS二维码的生成和扫描
- iOS--二维码生成和扫描
- iOS开发二维码生成和扫描
- iOS开发之原生二维码生成与扫描
- iOS中 扫描二维码/生成二维码详解
- iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客
- IOS笔记061之二维码的生成和扫描
- IOS 中实现自定义扫描二维码和生成二维码
- iOS开发-原生二维码的扫描和生成
- IOS开发二维码生成及扫描ZBarDemo
- Android平台二维码之生成,扫描 & 识别
- iOS原生二维码的生成与扫描
- iOS中 扫描二维码/生成二维码详解
- iOS 条形码 二维码 的生成 和 扫描 zBarSDK zXing
- ios 原生二维码的扫描和生成
- iOS开发-原生二维码的扫描和生成
- cocos2dx-lua在ios上实现生成及扫描二维码
- iOS中 扫描二维码/生成二维码详解 韩俊强的博客