我在菜鸟系列里讲过我们可以使用UIKit和CoreGraphics绘制图片和文字,这里就简单的讲一下在app中很常见的地方:图形文字验证码的绘制。
讲到图形验证码,顾名思义,就是在注册或者登录的时候,系统会弹出几个文字或者字母数字供我们选择,这一方面可以验证操作的真实性,另一方面也可以防止不法分子域名攻击。
效果如:
按照往常的习惯,先贴github地址,因为代码其实很简单,相信看一下代码就明白了,喜欢的赏颗星星
不过我还是想唠叨两句,不然代码不是白写了。。。。。。
跟图形绘制一样,我们在自定义空间GraphCodeView的- (void)drawRect:(CGRect)rect;方法中截取出文字,然后对文字进行绘制操作,再添加两条干扰线。
NSString *text = [NSString stringWithFormat:@"%@",_codeStr];
CGSize cSize = [@"A" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}];
int width = rect.size.width/text.length - cSize.width;
int height = rect.size.height - cSize.height;
上面这两句代码无非就是根据字号获取等分字符之间的间距
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];
[textC drawAtPoint:point withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0]}];
通过上面的方法随机获取绘制文字的坐标,这样看起来达到绘制文字参差不齐的效果
最后就是绘制干扰线的操作了
//绘制干扰线
for (int i = 0; i < 2; i++)
{
UIColor *color=[UIColor colorWithRed:arc4random() % 256 / 256.0 green:arc4random() % 256 / 256.0 blue:arc4random() % 256 / 256.0 alpha:1.0];
;
CGContextSetStrokeColorWithColor(context, color.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);
}
这里要注意一点,字符串的获取我是定义了NSString+random分类,添加了随机获取字符串的方法
+(NSString *)randomStringWithLength:(NSInteger)len {
NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
NSMutableString *randomString = [NSMutableString stringWithCapacity: len];
for (NSInteger i = 0; i < len; i++) {
[randomString appendFormat: @"%C", [letters characterAtIndex: arc4random_uniform([letters length])]];
}
return randomString;
}
当然这里如果有特定需求也可以从后台那里拿,绘制步骤还是不变的;
区分大小写的不同操作如下,按照需要选择。
// 不区分大小写
BOOL result = [_str compare:_codeTextField.text
options:NSCaseInsensitiveSearch |NSNumericSearch] == NSOrderedSame;
// 区分大小写
BOOL result2 = [_str isEqualToString:_codeTextField.text];
如果需要重新获取验证字符,则只需要重绘即可,如下。
[_graphCodeView setCodeStr:_str];
[_graphCodeView setNeedsDisplay];