二维码生成扫描和识别(基于系统提供方法)

iOS进阶

现在越来越多的App添加了一个扫码的功能,方便而且很实用,但是目前对弈iOS来说有些比较知名的库(比如ZXingObjC)库都比较大,而实际上,在iOS 7.0之后系统在AVFoundation框架中就已经实现了对于二维码扫描和生成的的支持,我的方法主要是对系统的一些东西稍作封装(QRCode

1、目的

现在越来越多的App添加了一个扫码的功能,方便而且很实用,但是目前对弈iOS来说有些比较知名的库(比如ZXingObjC)库都比较大,而实际上,在iOS 7.0之后系统在AVFoundation框架中就已经实现了对于二维码扫描和生成的的支持,我的方法主要是对系统的一些东西稍作封装(QRCode

2、生成二维码

目前见到的二维码一般是两种,中间有图片和没有图片的(通常是APP图标或者个人头像)或者是为二维码添加了背景颜色。这里我提供了三个方法,可以满足这几种需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* 生成二维码图片的方法
*
* @param string 二维码包含的内容
* @param size 图片的尺寸
* @param topimg 如果中间需要添加 头像可以传入此参数
*
* @return 包含要生成内容的二维码图片
*/

+ (UIImage *)qrImageForString:(NSString *)string
imageSize:(CGFloat)size Topimg:(UIImage *)topimg;

/**
* 生成二维码图片的方法
*
* @param string 二维码包含的内容
* @param size 图片的尺寸
* @param pointType 点的类型(QRPointRect,
QRPointRound)
* @param positionType 位置的类型 (QRPositionNormal,
QRPositionRound)
* @param color 背景颜色
*
* @return 包含要生成内容的二维码图片
*/
+(UIImage *)qrImageForString:(NSString *)string
imageSize:(CGFloat)size
withPointType:(QRPointType)pointType
withPositionType:
(QRPositionType)positionType
withColor:(UIColor *)color;

/**
* 生成二维码图片的方法
*
* @param string 二维码包含的内容
* @param size 图片的尺寸
* @param topimg 如果中间需要添加 头像可以传入此参数
* @param color 背景颜色
*
* @return 包含要生成内容的二维码图片
*/

+(UIImage*)qrImageForString:(NSString *)string
imageSize:(CGFloat)size
Topimg:(UIImage *)topimg
withColor:(UIColor*)color;

3、二维码扫描

这里 需要重要注意的是 rectOfInterest属性的设置

1
2
3
4
5
6
7
8
9
10

//它的作用就是设置扫描范围
output.rectOfInterest = scanCrop;

这个CGRect参数和普通的Rect范围不太一样,它的四个值的范围都是0-1,表示比例。

rectOfInterest都是按照横屏来计算的 所以当竖屏的情况下 x轴和y轴要交换一下。

宽度和高度设置的情况也是类似。

具体的扫描结果通过遵守AVCaptureMetadataOutputObjectsDelegate协议并实现

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

代理方法就可以拿到

扫描

4、其他的使用场景

除了最常见的扫描识别二维码的方式之外 还有点击弹出框 选择识别图中二维码,或者 长按直接识别二维码的方式

1
2
3
4
5
6
7
8
9
10
/**
* 识别图中的二维码
*
* @param aImage 图片
* @param aCompletion 识别完成的回调
*/
- (void)recognitionQRCodeFromImage:(UIImageView *)aImage
completion:(void (^)(NSString *result,
NSError *error))aCompletion;

长按识别

5、总结

这样的话在我们日常使用中常见的几种对于二维码的操作,基本可以实现。希望这个demo对你有所帮助。