一、扫码

  扫描的控件是一个view,使用者只需贴在自己的控制器内即可。其他UI用户可在自己控制器随便添加。代码如下

- (void)viewDidLoad {
[super viewDidLoad]; //扫描有效区(即框内透明区域)
CGRect interestRect = CGRectMake(, (self.view.frame.size.height - (self.view.frame.size.width - ))/2.0f, self.view.frame.size.width - , self.view.frame.size.width - ); //扫描控件
_scanView = [[LFQRCodeScanner alloc] initWithFrame:self.view.bounds rectOfInterest:interestRect];
_scanView.imgLine.image = [UIImage imageNamed:@"line"];
_scanView.scanFilishBlock = ^(AVMetadataMachineReadableCodeObject *result) {
NSLog(@"扫描结果:%@",result.stringValue);
};
[self.view insertSubview:_scanView atIndex:];//将扫描view放到底层
} - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear: animated];
[self.scanView start];
} - (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear: animated];
[self.scanView stop];
}

二、生成二维码

  1.生成二维码调一个方法即可,颜色和logo可不传

UIImage *imageCode = [LFQRCodeUtil createQRimageString:self.tfInput.text sizeWidth: fillColor:self.selectedColor logo:self.ivLogo.image];

  2.生成二维码,带阴影只需要给你的UIImageView加阴影即可,注意:UIImageView要是背景透明的。

//生成二维码
- (IBAction)creatCode:(id)sender {
UIImage *imageCode = [LFQRCodeUtil createQRimageString:self.tfInput.text sizeWidth: fillColor:self.selectedColor logo:self.ivLogo.image];
self.ivCodeResult.image = imageCode; self.ivCodeResult.layer.shadowOffset = CGSizeMake(self.sliderShadow.value, self.sliderShadow.value); // 设置阴影的偏移量
self.ivCodeResult.layer.shadowRadius = ; // 设置阴影的半径
self.ivCodeResult.layer.shadowColor = [UIColor blackColor].CGColor; // 设置阴影的颜色为黑色
self.ivCodeResult.layer.shadowOpacity = 0.4; // 设置阴影的不透明度
}

  3.保存不带阴影的二维码,很简单,只需要将self.ivCodeResult.image存到相册即可。

//保存
UIImageWriteToSavedPhotosAlbum(self.ivCodeResult.image, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);

  

  4.保存带阴影的二维码。不能直接保存self.ivCodeResult.image,因为阴影属于self.ivCodeResult,而不属于self.ivCodeResult.image。然后我想到对self.ivCodeResult截屏,然而截屏的二维码缝隙是黑色的,是因为self.ivCodeResult背景透明。那么我想到给self.ivCodeResult增加一个背景为白色的父视图,然后对这个父视图截屏。虽然得到了我想要的样子,然而这个截屏的尺寸太小了,还是不太理想。于是想到用一个frame较大的临时UIImageView存放二维码,及一个frame较大的临时白色父视图。然后对这个大的白色父视图截屏。

//保存
- (IBAction)saveCode:(id)sender {
//Frame较大的临时图片用于截图(不直接截图ivCodeResult,是因为ivCodeResult的Frame太小)
UIImageView *tempImageView = [[UIImageView alloc] initWithFrame:CGRectMake(, , self.ivCodeResult.image.size.width, self.ivCodeResult.image.size.height)];
tempImageView.backgroundColor = [UIColor clearColor];//注意:背景透明才会有阴影
tempImageView.layer.shadowOffset = CGSizeMake(self.sliderShadow.value * [UIScreen mainScreen].scale, self.sliderShadow.value * [UIScreen mainScreen].scale); // 设置阴影的偏移量
tempImageView.layer.shadowRadius = self.sliderShadow.value * [UIScreen mainScreen].scale; // 设置阴影的半径
tempImageView.layer.shadowColor = [UIColor blackColor].CGColor; // 设置阴影的颜色为黑色
tempImageView.layer.shadowOpacity = 0.5; // 设置阴影的不透明度
tempImageView.image = self.ivCodeResult.image; //因为tempImageView是透明背景,这里不能直接截图tempImageView,否则会出现空隙部分是黑色。处理办法是将tempImageView放到另一个tempView中且tempView不能透明,然后保存tempView的截图
UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(, , self.ivCodeResult.image.size.width, self.ivCodeResult.image.size.height)];
tempView.backgroundColor = [UIColor whiteColor];
[tempView addSubview:tempImageView]; //截图
UIGraphicsBeginImageContextWithOptions(tempView.bounds.size, YES, );
[tempView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); //保存
UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
}

源码地址:https://github.com/zhanglinfeng/LFQRCode

支持cocoaPods

pod 'LFQRCode' (推荐)

2017.12.25修改:

这只是LFKit的一个子库,LFKit地址https://github.com/zhanglinfeng/LFKit

以后只在LFKit中维护了

只需LFQRCode的 pod 'LFKit/Component/LFQRCode'

需要LFKit中所有自定义控件的pod 'LFKit/Component'

需要总库的 pod 'LFKit'

iOS 简单易用的二维码扫描及生成二维码三方控件LFQRCode,可灵活自定义UI的更多相关文章

  1. iOS 原生二维码扫描和生成

    代码地址如下:http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工 ...

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

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

  3. Android二维码扫描、生成

    Android二维码扫描.生成 现在使用二维码作为信息的载体已经越来越普及,那么二维码的生成以及扫描是如何实现的呢 google为我们提供了zxing开源库供我们使用 zxing GitHub源码地址 ...

  4. 二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...

    版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任. https://blog.csdn.net/lidew521/article/details/244418 ...

  5. 学习方法和阶段介绍 、 iOS界面开发引入 、 构造第一个App 、 视图控制器和视图 、 控件与事件 、 InterfaceBuilder

    1 创建并运行第一个App 1.1 问题 使用Xcode创建一个App项目,该应用实现功能在界面上显示Hello World标签,在模拟器中的运行结果如图-1所示: 图-1 1.2 方案 分析图-1, ...

  6. fastscript增加三方控件之二

    fastscript增加三方控件之二 unit fs_BsDataSet; interface {$i fs.inc} uses SysUtils, Classes, fs_iinterpreter, ...

  7. jquery.qrcode.js生成二维码(前端生成二维码)

    官网地址:http://jeromeetienne.github.io/jquery-qrcode/ 第一步引入插件: <script type='text/javascript' src='h ...

  8. Swift:使用系统AVFoundation实现二维码扫描和生成

    系统提供的AVCaptureSession仅仅适用于iOS7.0以上的系统.之前的请用Zbar来替代 下载地址:http://download.csdn.net/detail/huobanbengku ...

  9. Swift AVFoundation 二维码扫描和生成

    项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关A ...

随机推荐

  1. Spring学习-- SpEL表达式

    Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于 EL:SpEL 使用 #{...} 作为定界符 , 所有在大括号中的字符都将被认为是 SpE ...

  2. 原型prototype与原型链__proto__

    在 javascript 中我们会约定俗成,如果一个方法是被 new 出来使用的,那么该方法名首字母通常会大写,例如下面代码块中的 Person. var Person = function(name ...

  3. Eclipse Jetty调试时无法保存js文件

    Jetty会使用内存映射文件来缓存静态文件,包括js,css文件. 在Windows下,使用内存映射文件会导致文件被锁定,所以当Jetty启动的时候无法在编辑器对js或者css文件进行编辑. 解决办法 ...

  4. python并发进程

    1 引言 2 创建进程 2.1 通过定义函数的方式创建进程 2.2 通过定义类的方式创建进程 3 Process中常用属性和方法 3.1 守护进程:daemon 3.2 进程终结于存活检查:termi ...

  5. 解决Idea Jsp <%%>中 request resopnse等无自动提示的问题

    解决办法:缺少Apache的lib依赖, 只需 File->Project Srructure->Libraries 加号 找到Apache安装的lib目录添加依赖即可.亲测可用

  6. 【CodeForces】841D. Leha and another game about graph(Codeforces Round #429 (Div. 2))

    [题意]给定n个点和m条无向边(有重边无自环),每个点有权值di=-1,0,1,要求仅保留一些边使得所有点i满足:di=-1或degree%2=di,输出任意方案. [算法]数学+搜索 [题解] 最关 ...

  7. wiki 2490 导弹拦截塔

    2013-09-23 21:16 二分答案+匈牙利判断 对于每一个时间,我们重新建一张二分图,由于每个塔可能打多次,所以要拆点, 对于每个拆的点的可行飞行距离为(mid-t1)-(ll-1)*(t1+ ...

  8. 如何加快Eclipse的启动速度?

    http://it.taocms.org/12/6457.htm 浅析配置更快的Eclipse方法 What is the Metadata GC Threshold and how do I tun ...

  9. HDU3746(KMP求循环节)

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  10. python 学习笔记 多进程

    要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两 ...