二维码在iOS中的创建已经非常普遍,但是算作偏门的冷知识,建议不用死记代码,很头疼的代码!建议用的时候直接在网上找就可以了,今天提供二维码创建的方法类,节省了在网上找的时间哦!
代码如下
.h文件中声明调用方法和参数类型:
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface GJProduceTwoCode : NSObject /** 创建二维码 *参数1:二维码目标字符串 *参数2:指定生成的大小size - 建议size的大小传imageView的大小 *参数3:添加的logo(可以为nil) - 其中logo的大小为size的5.0(默 认, 也可以去修改pro) */ + (UIImage *)codeWidthDataString:(NSString *)TargetString size:(CGFloat)size logo:(NSString *)logoName;@end
.m文件中具体方法的实现
#import "GJProduceTwoCode.h"static CGFloat pro = 5.0;@implementation GJProduceTwoCode/** 创建二维码 参数1:二维码目标字符串 参数2:指定生成的大小size - 建议size的大小传imageView的大小 参数3:添加的logo(可以为nil) - 其中logo的大小为size的5.0(默认, 也可以去修改pro) */ + (UIImage *)codeWidthDataString:(NSString *)TargetString size:(CGFloat)size logo:(NSString *)logoName { //1、创建过滤器 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //2、过滤器恢复默认 [filter setDefaults]; //3、给过滤器添加数据(数据要转化成UTF8) NSData *data = [TargetString dataUsingEncoding:NSUTF8StringEncoding]; //4、通过KVO设置滤镜inputMessage数据 [filter setValue:data forKey:@"inputMessage"]; //5、获取输出的二维码 CIImage *outputImage = [filter outputImage]; // 画出二维码 UIImage *targeImage = [self createNonInterpolatedUIimaegFormCIImage:outputImage withSize:size logo:(logoName != nil ? logoName : nil)]; return targeImage; } #pragma mark - 根据参数画出二维码+ (UIImage *)createNonInterpolatedUIimaegFormCIImage:(CIImage *)image withSize:(CGFloat)size logo:(NSString *)logoName{ // 获取图片的frame值,转换 CGRect extent = CGRectIntegral(image.extent);// 设置比例 CGFloat scale = MIN(size / CGRectGetWidth(extent), size / CGRectGetHeight(extent)); //1、创建bitMap size_t width = CGRectGetWidth(extent) * scale; size_t height = CGRectGetHeight(extent) * scale; // 创建图形上下文// 设置渐变空间 CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();// 创建图形上下文空间 CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);// CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef bitmapImage = [context createCGImage:image fromRect:extent]; CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone); CGContextScaleCTM(bitmapRef, scale, scale); CGContextDrawImage(bitmapRef, extent, bitmapImage); //2、保存bitImage图片 CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef); CGContextRelease(bitmapRef); CGImageRelease(bitmapImage); UIImage *outputImage = [UIImage imageWithCGImage:scaledImage]; //生成logo BOOL logo = logoName != nil ? YES : NO; if (logo) { UIGraphicsBeginImageContextWithOptions(outputImage.size, NO, [[UIScreen mainScreen] scale]); [outputImage drawInRect:CGRectMake(0, 0, size, size)]; UIImage *waterImage = [UIImage imageNamed:logoName]; //注意:logo不能太大(最大不能超过二维码图片的30%),否则扫描不出来 [waterImage drawInRect:CGRectMake((size - size / pro) / 2., (size - size / pro) / 2., size / pro, size / pro)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); outputImage = newImage; } return outputImage; }@end
代码中的注释写的已经很清楚了,就不再做过多的解释了,给一个效果图吧!
Snip20171207_2.png
作者:guojie
链接:https://www.jianshu.com/p/d33da3f5d268