二维码的本质是一个字符串,我们通过扫描二维码来获取一个字符串,通过对字符串的解析,来获取字符串中的内容. 下面就用代码来生成一个自己的二维码 .
- 首先创建二维码需要一个二维码过滤器的类对象;
CIFilter * qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
filterWithName: 该方法根据一个指定的过滤类型来创建一个过滤器.那么我们如何知道该类型的名字是"CIQRCodeGenerator"它呢? 我们可以通过下面这两句代码来进行打印输出一下过滤器的种类有哪些:
NSArray * filters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"filters : %@", filters);
运行后,会在控制台输出很多类型,可以通过commond+f来搜索(先将光标移到控制台,点击控制台再进行搜索),已知二维码的简写为QRCODE(quick response code),所以我们搜索qr即可找到我们需要的过滤器名称.
- 有了过滤器对象后,我们需要给它设置默认值.不仅仅二维码过滤器需要设置默认值,任何过滤器对象都需要设置默认值.(说实话,这个原因我给忘了...想起来再补上.)
[qrFilter setDefaults];
- 接下来我们设置二维码的内容.
[qrFilter setValue:[@"我 的天" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
二维码的内容是一个字符,但是不能直接设置字符串,这里需要转成NSData类型,否则的话,会直接崩溃.还有后面的那个莫名其妙的key值又是怎么来的?可以通过下面的代码进行输出,来弄明白到底有哪些key值.
NSLog(@"%@", qrFilter.inputKeys);
对于上述的inputKeys属性,苹果是这样介绍的: Returns an array containing the names of all inputs in the filter.(返回一个在过滤器中所有输出的名字的数组).通过控制台的输出,我们可以看出有两个name,也就是在设置二维码时需要的key值: inputMessage(二维码的内容),inputCorrectionLevel(输入的正确率)
- 设置完内容后,我们就可以将二维码输出出来
CIImage * ciimage = qrFilter.outputImage;
ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(8, 8)];
输出的图片是一个CIImage类型的对象,所以用一个CIImage对象来接收,接着我又将图片进行了放大,因为我在storyboard上放置了一个200*200的UIImageView,如果不进行放大,那么就会看起来很模糊


下面附上完整代码:
- (void)viewDidLoad {
[super viewDidLoad];
//二维码本质是一个字符
NSArray * filters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"filters : %@", filters);
//1. 创建二维码过滤器
CIFilter * qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//2. 设置默认值
[qrFilter setDefaults];
/**
inputMessage,
inputCorrectionLevel
*/
NSLog(@"%@", qrFilter.inputKeys);
//3.设置二维码的内容
[qrFilter setValue:[@"我 的天" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
//4. 输出图片
CIImage * ciimage = qrFilter.outputImage;
ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(8, 8)];
NSLog(@"%@", ciimage);
self.imageView.image = [UIImage imageWithCIImage:ciimage];
}
PS: 我在 storyboard中放了一个200*200的UIImageView,然后拖线属性到ViewController的扩展当中.这不单单可以设置一句话,也可以设置一个网址之类的.... thank you for watching