自定义验证码视图(OC)

混淆的验证码视图,是我们日常经常用到的功能模块之一,一般来说后台不会直接返回我们验证码的图片,一般需要我们将字符串信息转换成我们需要的视图;不管是转换成View还是button,这里介绍一个比较简单的方法,重写

- (void)drawRect:(CGRect)rect

这里一般需要两个步骤,一是重写字符串的字体大小、颜色、样式等
首先计算每个字符显示的位置

    NSString *text  =  [NSString stringWithFormat:@"%@", self.verifyCode];
    
    CGSize cSize  =  [@"A" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}];
    
    int width  =  rect.size.width/text.length - cSize.width;
    int height  =  rect.size.height - cSize.height;

设置字符串的字体大小、颜色

 for ( int i  =  0; i<text.length; i++)
    {
        pX  =  arc4random() % width + rect.size.width/text.length * i;
        pY  =  arc4random() % height;
        point  =  CGPointMake(pX, pY);
        
        unichar c  =  [text characterAtIndex:i];
        NSString *textC  =  [NSString stringWithFormat:@"%C", c];
        
        UIFont *randomFont = [UIFont systemFontOfSize:arc4random() % 5 + 15];
        [textC drawAtPoint:point withAttributes:@{NSFontAttributeName : randomFont}];
    }

当然这样还是完全不够的,还需要我们绘制干扰线

 CGContextRef context  =  UIGraphicsGetCurrentContext();
    //设置线条宽度
    CGContextSetLineWidth(context, kLineWidth);
    
    //绘制干扰线
    for (int i  =  0; i < kLineCount; i++)
    {
        UIColor *randomColor = [UIColor colorWithRed:arc4random() % 256 / 256.0 green:arc4random() % 256 / 256.0 blue:arc4random() % 256 / 256.0 alpha:1.0];
        CGContextSetStrokeColorWithColor(context, randomColor.CGColor);//设置线条填充色
        
        //设置线的起点
        pX  =  arc4random() % (int)rect.size.width;
        pY  =  arc4random() % (int)rect.size.height;
        CGContextMoveToPoint(context, pX, pY);
        //设置线终点
        pX  =  arc4random() % (int)rect.size.width;
        pY  =  arc4random() % (int)rect.size.height;
        CGContextAddLineToPoint(context, pX, pY);
        //画线
        CGContextStrokePath(context);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 混淆的验证码视图,是我们日常经常用到的功能模块之一,一般来说后台不会直接返回我们验证码的图片,一般需要我们将字符串...
    hoggenWang阅读 341评论 0 0
  • 我是一个比较内向的人,一直都很喜欢用文字来表达自己的感情,无论喜、怒、哀、乐。 最近开始尝试着在简书这个平...
    海璇阅读 269评论 0 2
  • 又是一年金榜题名时,几家欢喜几家愁。 李二婶家的老三后天请客,张大爷家的孙女下个星期一办酒。哎呀,这些伢们好争气呀...
    浅浅共阅圈阅读 482评论 3 7