iOS - 二维码的方法类,拖进去就能用!

作者: JollyJerry | 来源:发表于2017-12-07 10:27 被阅读48次

二维码在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

相关文章

网友评论

    本文标题:iOS - 二维码的方法类,拖进去就能用!

    本文链接:https://www.haomeiwen.com/subject/qjxdixtx.html