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