SDauthCode:一个基于Core Graphics框架的本地动态验证码


SDauthCode简介


SDauthCode是一款基于Core Graphics框架的本地动态验证码,SDauthCode使用起来简单易懂,如果我们不需要特别的定制,我们只需要一行代码就可以快速生成一个本地验证码View,同时,允许用户对SDauthCode的样式进行调整.比如取材库,验证码的位数,干扰线的条数,刷新验证码等等,通过不同的定制可以应对不同的实际情况.那么我们接下来看一下SDauthCode的实际效果.



一行代码快速生成验证码


首先,我们把SDauthCode.hSDauthCode.m两个文件导入所需要的工程当中去.

使用SDauthCode快速生成验证码,我们只需要一个初始化方法即可.无需繁琐步骤,即可快速生成.代码如下.

    SDauthCode *codeView = [[SDauthCode alloc]initWithFrame:CGRectMake(100, 100, 200, 40)];

只要把上面的codeView添加到所需要放置的位置上即可.

    [self.view addSubview:codeView];

那么如何验证用户是否输入正确呢?SDauthCode有个属性叫做authCodeString,我们只需要把输入的字符串和authCodeString比较即可.

    if ([codeView.authCodeString isEqualToString:self.textField.text]) {
        
        //这里面写验证正确之后的动作.

        tipWithMessage(@"输入验证码正确");
    }else{
        
        //这里面写验证失败之后的动作.

        tipWithMessage(@"输入验证码错误");
    }


SDauthCode的专属定制


当快速生成不能满足我们的需求的时候,这时候,你可以根据SDauthCode所暴露出来的属性,来定制属于自己的本地动态验证码.下面我们就看一下SDauthCode的所有的定制属性.

属性 类型 说明
allWordArraytype AllWordArraytypes allWordArraytype是一个枚举类型,用来指定取材库的类型,默认的是文字和数字混合模式.
authCodeNumber NSInteger authCodeNumber是用来定制验证码的字符个数的,默认的是4位
disturbLineNumber NSInteger disturbLineNumber是用来指定图片中干扰线的数量的,默认的是2条干扰线
fontSize NSInteger fontSize是用来指定验证码字体大小的,默认的为17号字
WordSpacingTypes WordSpacingTypes WordSpacingTypes是一个枚举类型,用来指定字符间距的大小,有4种可以选择,分别是没有间隔,间隔较小,间隔中等,间隔较大,对应的数字为0,10,20,40
authCodeRect CGRect authCodeRect是用来指定验证码字符串的大小和位置.


SDauthCode的重新生成


验证码的重新生成总共有两种方式,一种是用户直接点击验证码,另外一种则是调用SDauthCode自带的-(void)reloadAuthCodeView;方法进行重新生成.

直接点击SDauthCode对象,在SDauthCode对象的touchBegan方法中会重新生成验证码以及重新绘制SDauthCode对象.

调用-(void)reloadAuthCodeView;方法原理和touchBegan是一样的,会重新生成验证码以及重新绘制SDauthCode对象.调用如下所示.一句代码即可.

    [codeView reloadAuthCodeView];


SDauthCode的核心代码详解


本文的题目就说是SDauthCode是一个基于Core Graphics框架的本地动态验证码.所以核心代码是存在于SDauthCode中的- (void)drawRect:(CGRect)rect方法中的.

在此之前,我们会到指定取材库中取出指定的个数的字符,组成字符串.同时要赋值给authCodeString属性.

#pragma mark ---- 随机生成验证码 ----
-(void)produceAuthCodeString{

    NSMutableString *produceString = [[NSMutableString alloc]initWithCapacity:16];
    
    switch (self.allWordArraytype) {
        case BlendWordAndNumbers:{
        
            //混合库模式
            
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
            
            [blendArray addObjectsFromArray:self.wordsArray];
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //随机下标
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
        
        }
            
            break;
            
        case OnlyNumbers:{
            
            //数字模式
            
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
            
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //随机下标
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
      
        }
            
            break;
              
        case OnlyWord:{
            
            //字母模式
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.wordsArray];
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //随机下标
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
            

        }
            
            break;
   
    }
    

    self.authCodeString = produceString;


}

然后,我们可以在- (void)drawRect:(CGRect)rect方法中,先设置SDauthCode的背景颜色为随机色.

    //背景设置
    self.backgroundColor = KrandomColor;

然后就是绘制我们的文本,在绘制之前,我们会根据定制属性来先设置我们的文本属性信息,然后进行绘制操作.代码如下所示.

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

    paragraphStyle.alignment = NSTextAlignmentCenter;//(两端对齐的)文本对齐方式:(左,中,右,两端对齐,自然)
    
    
    [self.authCodeString drawInRect:_authCodeRect withAttributes:@{
                                                               
                                                                NSForegroundColorAttributeName :KrandomColor,
                                                                NSKernAttributeName: [self wordSpacingNumberWithType],
                                                                NSParagraphStyleAttributeName:paragraphStyle,
                                                                NSFontAttributeName : [UIFont systemFontOfSize:_fontSize],
                                                               
                                                                }];

接着,就要绘制干扰线了,我们让干扰线的初始位置和终止位置为随机的.

        //设置随机位置的x和y
        CGSize viewSize = self.frame.size;
        
        int startX = arc4random()%((int)viewSize.width/2);
        
        int endX = arc4random()%((int)viewSize.width - (int)viewSize.width/2) +(int)viewSize.width/2;
        
        int startY = arc4random()%((int)viewSize.height);
        
        int endY = arc4random()%((int)viewSize.height);

设置完成干扰线的初始位置和终止位置,我们直接绘制我们的干扰线即可,代码如下所示.当然,绘制完成之后,要释放掉绘制的路径.

        //获取上下文
        CGContextRef contextRef = UIGraphicsGetCurrentContext();
        
        //创建路径
        CGMutablePathRef path = CGPathCreateMutable();
        
        CGPathMoveToPoint(path, nil, startX, startY);
        
        CGPathAddLineToPoint(path, nil, endX, endY);
        
        CGContextAddPath(contextRef, path);
        
        //设置图形上下文状态属性
        CGContextSetRGBStrokeColor(contextRef, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, 1);//设置笔触颜色
        CGContextSetLineWidth(contextRef, 1);//设置线条宽度
        
        CGContextDrawPath(contextRef, kCGPathFillStroke);//最后一个参数是填充类型
        
        CGPathRelease(path);

绘制干扰线完成之后,我们的绘制核心工作也就完成了.



最后再说,SDauthCode是一个本地的动态验证码,它的主要作用是用于防止有人恶意访问接口.恩写到这,Core Graphics框架相关学习资料也将告一段落了,最后附上SDauthCode的下载传送门.
-->SDauthCode传送门💾
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,745评论 25 707
  • 该属性用来确定navigation bar背景是否为半透明.如果设置该属性为NO,那么就不会有上面半透明的效果.
    指尖的跳动阅读 338评论 0 0
  • 2017年10月30日 星期一 晴 有些人,只能陪你到这 昨晚关灯入睡前,脑子里一直闪过这句话:有些人,只能陪你到...
    小小颖子阅读 210评论 0 0
  • 越来越多的人开始接受这样的观点 - 学习不会在离开校园后停止,而是将伴随我们终生。 一、为什么要终生学习 1、学习...
    人在旅途_Amber阅读 13,555评论 6 19