iOS开发之图片验证码

我在菜鸟系列里讲过我们可以使用UIKit和CoreGraphics绘制图片和文字,这里就简单的讲一下在app中很常见的地方:图形文字验证码的绘制。

讲到图形验证码,顾名思义,就是在注册或者登录的时候,系统会弹出几个文字或者字母数字供我们选择,这一方面可以验证操作的真实性,另一方面也可以防止不法分子域名攻击。

效果如:

iOS开发之图片验证码_第1张图片


按照往常的习惯,先贴github地址,因为代码其实很简单,相信看一下代码就明白了,喜欢的赏颗星星

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];

你可能感兴趣的:(iOS开发之图片验证码)