为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
iOS

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

代码中的注释写的已经很清楚了,就不再做过多的解释了,给一个效果图吧!

https://img1.sycdn.imooc.com//5d5e01510001783806680366.png

Snip20171207_2.png



作者:guojie
链接:https://www.jianshu.com/p/d33da3f5d268

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消