SDauthCode簡(jiǎn)介
SDauthCode是一款基于Core Graphics框架的本地動(dòng)態(tài)驗(yàn)證碼,SDauthCode使用起來(lái)簡(jiǎn)單易懂,如果我們不需要特別的定制,我們只需要一行代碼就可以快速生成一個(gè)本地驗(yàn)證碼View,同時(shí),允許用戶對(duì)SDauthCode的樣式進(jìn)行調(diào)整.比如取材庫(kù),驗(yàn)證碼的位數(shù),干擾線的條數(shù),刷新驗(yàn)證碼等等,通過(guò)不同的定制可以應(yīng)對(duì)不同的實(shí)際情況.那么我們接下來(lái)看一下SDauthCode的實(shí)際效果.
一行代碼快速生成驗(yàn)證碼
首先,我們把SDauthCode.h
和SDauthCode.m
兩個(gè)文件導(dǎo)入所需要的工程當(dāng)中去.
使用SDauthCode快速生成驗(yàn)證碼,我們只需要一個(gè)初始化方法即可.無(wú)需繁瑣步驟,即可快速生成.代碼如下.
SDauthCode *codeView = [[SDauthCode alloc]initWithFrame:CGRectMake(100, 100, 200, 40)];
只要把上面的codeView添加到所需要放置的位置上即可.
[self.view addSubview:codeView];
那么如何驗(yàn)證用戶是否輸入正確呢?SDauthCode有個(gè)屬性叫做authCodeString,我們只需要把輸入的字符串和authCodeString比較即可.
if ([codeView.authCodeString isEqualToString:self.textField.text]) {
//這里面寫(xiě)驗(yàn)證正確之后的動(dòng)作.
tipWithMessage(@"輸入驗(yàn)證碼正確");
}else{
//這里面寫(xiě)驗(yàn)證失敗之后的動(dòng)作.
tipWithMessage(@"輸入驗(yàn)證碼錯(cuò)誤");
}
SDauthCode的專屬定制
當(dāng)快速生成不能滿足我們的需求的時(shí)候,這時(shí)候,你可以根據(jù)SDauthCode所暴露出來(lái)的屬性,來(lái)定制屬于自己的本地動(dòng)態(tài)驗(yàn)證碼.下面我們就看一下SDauthCode的所有的定制屬性.
屬性 | 類型 | 說(shuō)明 |
---|---|---|
allWordArraytype | AllWordArraytypes | allWordArraytype是一個(gè)枚舉類型,用來(lái)指定取材庫(kù)的類型,默認(rèn)的是文字和數(shù)字混合模式. |
authCodeNumber | NSInteger | authCodeNumber是用來(lái)定制驗(yàn)證碼的字符個(gè)數(shù)的,默認(rèn)的是4位 |
disturbLineNumber | NSInteger | disturbLineNumber是用來(lái)指定圖片中干擾線的數(shù)量的,默認(rèn)的是2條干擾線 |
fontSize | NSInteger | fontSize是用來(lái)指定驗(yàn)證碼字體大小的,默認(rèn)的為17號(hào)字 |
WordSpacingTypes | WordSpacingTypes | WordSpacingTypes是一個(gè)枚舉類型,用來(lái)指定字符間距的大小,有4種可以選擇,分別是沒(méi)有間隔,間隔較小,間隔中等,間隔較大,對(duì)應(yīng)的數(shù)字為0,10,20,40 |
authCodeRect | CGRect | authCodeRect是用來(lái)指定驗(yàn)證碼字符串的大小和位置. |
SDauthCode的重新生成
驗(yàn)證碼的重新生成總共有兩種方式,一種是用戶直接點(diǎn)擊驗(yàn)證碼,另外一種則是調(diào)用SDauthCode自帶的-(void)reloadAuthCodeView;
方法進(jìn)行重新生成.
直接點(diǎn)擊SDauthCode對(duì)象,在SDauthCode對(duì)象的touchBegan方法中會(huì)重新生成驗(yàn)證碼以及重新繪制SDauthCode對(duì)象.
調(diào)用-(void)reloadAuthCodeView;
方法原理和touchBegan是一樣的,會(huì)重新生成驗(yàn)證碼以及重新繪制SDauthCode對(duì)象.調(diào)用如下所示.一句代碼即可.
[codeView reloadAuthCodeView];
SDauthCode的核心代碼詳解
本文的題目就說(shuō)是SDauthCode是一個(gè)基于Core Graphics框架的本地動(dòng)態(tài)驗(yàn)證碼.所以核心代碼是存在于SDauthCode中的- (void)drawRect:(CGRect)rect
方法中的.
在此之前,我們會(huì)到指定取材庫(kù)中取出指定的個(gè)數(shù)的字符,組成字符串.同時(shí)要賦值給authCodeString屬性.
#pragma mark ---- 隨機(jī)生成驗(yàn)證碼 ----
-(void)produceAuthCodeString{
NSMutableString *produceString = [[NSMutableString alloc]initWithCapacity:16];
switch (self.allWordArraytype) {
case BlendWordAndNumbers:{
//混合庫(kù)模式
NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
[blendArray addObjectsFromArray:self.wordsArray];
for (int i = 0; i<self.authCodeNumber; i++) {
//隨機(jī)下標(biāo)
int indexNumber = arc4random()%(blendArray.count);
[produceString appendString:blendArray[indexNumber]];
}
}
break;
case OnlyNumbers:{
//數(shù)字模式
NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
for (int i = 0; i<self.authCodeNumber; i++) {
//隨機(jī)下標(biāo)
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++) {
//隨機(jī)下標(biāo)
int indexNumber = arc4random()%(blendArray.count);
[produceString appendString:blendArray[indexNumber]];
}
}
break;
}
self.authCodeString = produceString;
}
然后,我們可以在- (void)drawRect:(CGRect)rect
方法中,先設(shè)置SDauthCode的背景顏色為隨機(jī)色.
//背景設(shè)置
self.backgroundColor = KrandomColor;
然后就是繪制我們的文本,在繪制之前,我們會(huì)根據(jù)定制屬性來(lái)先設(shè)置我們的文本屬性信息,然后進(jìn)行繪制操作.代碼如下所示.
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.alignment = NSTextAlignmentCenter;//(兩端對(duì)齊的)文本對(duì)齊方式:(左,中,右,兩端對(duì)齊,自然)
[self.authCodeString drawInRect:_authCodeRect withAttributes:@{
NSForegroundColorAttributeName :KrandomColor,
NSKernAttributeName: [self wordSpacingNumberWithType],
NSParagraphStyleAttributeName:paragraphStyle,
NSFontAttributeName : [UIFont systemFontOfSize:_fontSize],
}];
接著,就要繪制干擾線了,我們讓干擾線的初始位置和終止位置為隨機(jī)的.
//設(shè)置隨機(jī)位置的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);
設(shè)置完成干擾線的初始位置和終止位置,我們直接繪制我們的干擾線即可,代碼如下所示.當(dāng)然,繪制完成之后,要釋放掉繪制的路徑.
//獲取上下文
CGContextRef contextRef = UIGraphicsGetCurrentContext();
//創(chuàng)建路徑
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, startX, startY);
CGPathAddLineToPoint(path, nil, endX, endY);
CGContextAddPath(contextRef, path);
//設(shè)置圖形上下文狀態(tài)屬性
CGContextSetRGBStrokeColor(contextRef, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, 1);//設(shè)置筆觸顏色
CGContextSetLineWidth(contextRef, 1);//設(shè)置線條寬度
CGContextDrawPath(contextRef, kCGPathFillStroke);//最后一個(gè)參數(shù)是填充類型
CGPathRelease(path);
繪制干擾線完成之后,我們的繪制核心工作也就完成了.
最后再說(shuō),SDauthCode是一個(gè)本地的動(dòng)態(tài)驗(yàn)證碼,它的主要作用是用于防止有人惡意訪問(wèn)接口.恩寫(xiě)到這,Core Graphics框架相關(guān)學(xué)習(xí)資料也將告一段落了,最后附上SDauthCode的下載傳送門(mén).