本文博客,模仿杰瑞教育的一篇博文,并在它的基础上,进行了些许更改。同时在重写的过程中,对自己忽略的地方,进行了重新认识,受益匪浅。文章来源:http://www.cnblogs.com/jerehedu/p/4527707.html

其实这个功能,并不是很实用,但是,对于我们梳理细小的知识点,还是很有必要的。

一,首先,我们需要自定义一个view,这样,我们将图形绘制在里面,init这个view的时候,就可以直接显示了,以后再遇到,就可以“拿来主义”了。

codeView.h

@property(nonatomic, strong)NSMutableString * changeString;//存放验证码的字符串

我们需要一个public的参数,便于在外面引用的时候,直接读取。这个用来存放:系统生成的验证码。在输入的时候,我们直接用输入的字符串,和changeString直接进行比较即可。

codeView.m

#define kRandomColor [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1.0];

#define kLineCount 6

#define kLineWidth 1.0

#define kCharCount 6

#define kFontSize [UIFont systemFontOfSize:arc4random()%5 + 15]

宏定义一些经常用的参数,这样,就不必写后面的代码了。

在.m里面写.h的私有变量,用来存储字符数组

@interface codeView(){

NSArray * changeArray;//字符素材数组

}

@end

接下来,设置view的初始界面,也就是刚进入view的时候,出现的内容

-(instancetype)initWithFrame:(CGRect)frame{

if (self = [super initWithFrame:frame]) {

self.layer.masksToBounds = YES;//隐藏边界

self.backgroundColor = kRandomColor;

//显示一个随机验证码

[self changeCaptcha];

}

return self;

}

重写init方法,这样,就会在系统init的时候,显示出来。

//获取6个要显示的字符和数字

-(void)changeCaptcha{

changeArray = [[NSArray alloc]initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i",@"j",@"k",@"l",@"m",@"n",@"o",@"p",@"q",@"r",@"s",@"t",@"u",@"v",@"w",@"x",@"y",@"z", nil];

_changeString = [[NSMutableString alloc]initWithCapacity:kCharCount];

NSString * getStr = [[NSString alloc]init];

for (int i = 0; i < kCharCount; i++) {

NSInteger index = arc4random()%(changeArray.count-1);

getStr = [changeArray objectAtIndex:index];

_changeString = (NSMutableString *)[_changeString stringByAppendingString:getStr];

}

}

//设置点击,更好验证码的方法

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[self changeCaptcha];

[self setNeedsDisplay];

}

//画背景图和干扰线

-(void)drawRect:(CGRect)rect{

[super drawRect:rect];

self.backgroundColor = kRandomColor;

//获得要显示验证码字符串,根据长度,计算每个字符显示的大概位置

CGSize csize = [@"S" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}];

int width = rect.size.width/_changeString.length-csize.width;

int height = rect.size.height-csize.height;

CGPoint point;

//一次绘制每一个字符,可以设置显示的每个字符的字体大小、颜色、样式

float pX,pY;

for (int i = 0; i < _changeString.length; i++) {

pX = arc4random() % width + rect.size.width/_changeString.length*i;

pY = arc4random()%height;

point = CGPointMake(pX, pY);

unichar c = [_changeString characterAtIndex:i];

NSString * textC = [NSString stringWithFormat:@"%c",c];

[textC drawAtPoint:point withAttributes:@{NSFontAttributeName:kFontSize}];

}

//取得栈顶的CGContextRef

CGContextRef  context = UIGraphicsGetCurrentContext();

CGContextSetLineWidth(context, kLineWidth);

//绘制干扰的彩色直线

for (int i = 0; i < kLineCount; i++) {

CGFloat components[] = {arc4random()%255/255.0,arc4random()%255/255.0,arc4random()%255/255.0,arc4random()%255/255.0};

CGContextSetStrokeColor(context, components);

//设置起点

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

}

}

字体大小、颜色、符号、距离,都是随机的。

有一个地方,需要注意的就是:画图,只能在drawRect方法里面写才有效,在其他地方,均没有效果。

这样,自定义的view就ok了。

下面,就是如何在ViewController里面显示了。

在ViewController.h里面:

@interface ViewController : UIViewController<UITextFieldDelegate,UIAlertViewDelegate>

@property(nonatomic, retain)codeView * codeView;

@property(nonatomic, retain)UITextField * inputTextField;

@end

要遵循两个代理,UITextFieldDelegate、UIAlertViewDelegate。

在.m里面,主要是设置显示的坐标,以及键盘隐藏等几种方法

在viewDidLoad方法里面:

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

_codeView = [[codeView alloc]initWithFrame:CGRectMake(20, 40, 150, 40)];

[self.view addSubview:_codeView];

//提示文字

UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(190, 40, 100, 40)];

label.text = @"点击图片换验证码";

label.font = [UIFont systemFontOfSize:12];

label.textColor = [UIColor grayColor];

[self.view addSubview:label];

//添加输入框

_inputTextField = [[UITextField alloc]initWithFrame:CGRectMake(20, 100, 150, 40)];

_inputTextField.layer.borderColor = [[UIColor lightGrayColor]CGColor];

_inputTextField.layer.borderWidth = 2.0;

_inputTextField.layer.cornerRadius = 5.0;

_inputTextField.font = [UIFont systemFontOfSize:21];

_inputTextField.placeholder = @"请输入验证码";

_inputTextField.clearButtonMode = UITextFieldViewModeWhileEditing;

_inputTextField.backgroundColor = [UIColor clearColor];

_inputTextField.textAlignment = NSTextAlignmentCenter;

_inputTextField.returnKeyType = UIReturnKeyDone;

_inputTextField.delegate = self;

[self.view addSubview:_inputTextField];

//添加手势,用来隐藏键盘

UITapGestureRecognizer * tapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapToHideTheKeyBoard:)];

tapGestureRecognizer.cancelsTouchesInView = NO;

[self.view addGestureRecognizer:tapGestureRecognizer];

}

两种隐藏键盘的方法

#pragma mark --Tap

-(void)tapToHideTheKeyBoard:(UITapGestureRecognizer *)tap{

//    [_inputTextField resignFirstResponder];

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[_inputTextField resignFirstResponder];

}

点击键盘的Return消失键盘的方法

#pragma mark --UITextFieldDelegate

-(BOOL)textFieldShouldReturn:(UITextField *)textField{

if ([_inputTextField.text isEqualToString:_codeView.changeString ] || [_inputTextField.text isEqualToString:[_codeView.changeString lowercaseString]]) {

//弹出正确

UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"恭喜您" message:@"验证成功" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];

[alertView show];

}else{

//验证码不匹配,验证码和输入框晃动

CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"];

animation.repeatCount = 1;

animation.values = @[@-20,@20,@-20];

[_codeView.layer addAnimation:animation forKey:nil];

[_inputTextField.layer addAnimation:animation forKey:nil];

}

return YES;

}

点击确定按钮,收回键盘的方法

#pragma mark --UIAlertViewDelegate

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

//清空输入框内容,收回键盘

if (buttonIndex == 0) {

_inputTextField.text = @"";

[_inputTextField resignFirstResponder];

}

}

这样,这个功能就完成了。

这个地方的知识点主要是:

1.画线;

2.产生随机产生的字符

3.让键盘消失

在原有博客的基础上,增加了不区分大小写的小功能。

iPhone:iOS界面,本地生成随机验证码的更多相关文章

  1. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  2. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  3. struts2生成随机验证码图片

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...

  4. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  5. Python使用PIL模块生成随机验证码

    PIL模块的安装 pip3 install pillow 生成随机验证码图片 import random from PIL import Image, ImageDraw, ImageFont fro ...

  6. C#生成随机验证码例子

    C#生成随机验证码例子: 前端: <tr> <td width=" align="center" valign="top"> ...

  7. pillow实例 | 生成随机验证码

    1 PIL(Python Image Library) PIL是Python进行基本图片处理的package,囊括了诸如图片的剪裁.缩放.写入文字等功能.现在,我便以生成随机验证码为例,讲述PIL的基 ...

  8. Django中生成随机验证码(pillow模块的使用)

    Django中生成随机验证码 1.html中a标签的设置 <img src="/get_validcode_img/" alt=""> 2.view ...

  9. 使用模块PIL 生成 随机验证码

    --------------默认自己无能,无疑是给失败制造机会!你认为自己是什么样的人,就将成为什么样的人. 要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创 ...

随机推荐

  1. apache日志

    <VirtualHost *:80> ServerAdmin chinasir.xyz@gmail.com DocumentRoot /var/www/html/baidu ServerN ...

  2. 前端面试整理(HTML&CSS)

    1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素? 行内元素:和有他元素都在一行上,高度.行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他行内元素:其中im ...

  3. 常见的HTTP状态码有哪些?

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求. ...

  4. HTML5一些标签和属性

    <bdo> 元素 可以覆盖默认文本的方向  根据dir 属性来控制文字的排序方向            属性:dir="rtl"                     ...

  5. mysql基础 日期类型

  6. centos 7忘记了root密码,如何改密码?

    今天服务器突然进不去了,不知道是密码被改了,还是什么情况! 服务器版本:centos 7.0 网上查找了很多文档,有些办法不可行,如果是亲自试过绝对可行的方法: 1:重启服务器,如下界面,按键盘 &q ...

  7. Java高并发之同步异步

    1.概念理解: 2.同步的解决方案: 1).基于代码 synchronized 关键字 修饰普通方法:作用于当前实例加锁,进入同步代码前要获得当前实例的锁. 修饰静态方法:作用于当前类对象加锁,进入同 ...

  8. 什么是web语义化?

    Web语义化:是指使用语义恰当的标签,使页面有良好的结构,页面元素更有含义,能够让人和搜索引擎都容易理解.使团队项目的可持续运作及维护,去掉样式后页面呈现清晰的结构. 例如:<table> ...

  9. php-5.6.26源代码 - opcode处理器,“乘法opcode”处理器

    // opcode处理器 - 运算符怎么执行: “*” 乘法opcode处理器 static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(Z ...

  10. PLC状态机编程第四篇-历史状态处理

    今天我们接着上次的控制任务,加入历史状态,这个任务会比较复杂,象这样的任务我们倾向于自动生成PLC程序,自己写容易出错.但为了演示,我们可以尝试一下.言归正传,下面是我们的控制任务. 控制任务 这次的 ...