神刀安全网

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

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

SDauthCode简介


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

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

一行代码快速生成验证码


首先,我们把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传送门💾

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » SDauthCode:一个基于Core Graphics框架的本地动态验证码

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址