IOS实现验证码倒计时功能(一)

2016-02-19 09:04 40 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享IOS实现验证码倒计时功能(一),希望可以对大家能有小小的帮助。

【 tulaoshi.com - 编程语言 】

验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来写一个IDCountDownButton来实现验证码倒计时的效果。你可以想使用普通的UIButton类型按钮一样,只需要设置其倒计时时长(若未设置,默认为60秒),就可以轻松的实现点击countDownButton开始倒计时,倒计时结束方可重新点击。

一、实现效果
如图

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

二、实现思路
1、自定义一个IDCountDownButton,重写 beginTrackingWithTouch:withEvent: 拦截button的点击事件,根据是否正在倒计时决定是否响应并传递button的点击事件(若倒计时正在进行中,再次点击不会重新开始倒计时)
2、是用NSTimer定时器,定时改变IDCountDownButton的title
3、若倒计时结束,取消定时器并回复倒计时时长(使IDCountDownButton具备再次开始倒计时的能力)
4、在IDCountDownButton销毁时,同样取消定时器
三、实现步骤
1、添加相关的属性
公有属性(public)

@interface IDCountDownButton : UIButton/** 验证码倒计时的时长 */@property (nonatomic, assign) NSInteger durationOfCountDown;@end

私有属性

@interface IDCountDownButton ()/** 保存倒计时按钮的非倒计时状态的title */@property (nonatomic, copy) NSString *originalTitle;/** 保存倒计时的时长 */@property (nonatomic, assign) NSInteger tempDurationOfCountDown;/** 定时器对象 */@property (nonatomic, strong) NSTimer *countDownTimer;@end

2、重写setter
title属性的setter
1)、私有属性originalTitle用来暂存开始计时前button的标题,即用户设置的button的标题,通常是“获取验证码”
2)、需要屏蔽计时过程中,title更新时改变originalTitle的值

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
- (void)setTitle:(NSString *)title forState:(UIControlState)state { [super setTitle:title forState:state]; // 倒计时过程中title的改变不更新originalTitle if (self.tempDurationOfCountDown == self.durationOfCountDown) {  self.originalTitle = title; }}

durationOfCountDown属性的setter
1)、设置tempDurationOfCountDown的值
2)、tempDurationOfCountDown的作用:倒计时;与durationOfCountDown配合判断当前IDCountDownButton是否具备重新开始倒计时的能力

- (void)setDurationOfCountDown:(NSInteger)durationOfCountDown { _durationOfCountDown = durationOfCountDown; self.tempDurationOfCountDown = _durationOfCountDown;}

初始化
1)、设置倒计时的默认时长为60妙
2)、设置IDCountDownButton默认的title为“获取验证码”

- (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) {  // 设置默认的倒计时时长为60秒  self.durationOfCountDown = 60;  // 设置button的默认标题为“获取验证码”  [self setTitle:@"获取验证码" forState:UIControlStateNormal]; } return self;}- (instancetype)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) {  // 设置默认的倒计时时长为60秒  self.durationOfCountDown = 60;  // 设置button的默认标题为“获取验证码”  [self setTitle:@"获取验证码" forState:UIControlStateNormal]; } return self;}

拦截IDCountDownButton的点击事件,判断是否开始倒计时
1)、若tempDurationOfCountDown等于durationOfCountDown,说明未开始倒计时,响应并传递IDCountDownButton的点击事件;否则,不响应且不传递。

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { // 若正在倒计时,不响应点击事件 if (self.tempDurationOfCountDown != self.durationOfCountDown) {  return NO; } // 若未开始倒计时,响应并传递点击事件,开始倒计时 [self startCountDown]; return [super beginTrackingWithTouch:touch withEvent:event];}

倒计时
1)、创建定时器,开始倒计时

- (void)startCountDown { // 创建定时器 self.countDownTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateIDCountDownButtonTitle) userInfo:nil repeats:YES]; // 将定时器添加到当前的RunLoop中(自动开启定时器) [[NSRunLoop currentRunLoop] addTimer:self.countDownTimer forMode:NSRunLoopCommonModes];}

2)、更新IDCountDownButton的title为倒计时剩余的时间

- (void)updateIDCountDownButtonTitle { if (self.tempDurationOfCountDown == 0) {  // 设置IDCountDownButton的title为开始倒计时前的title  [self setTitle:self.originalTitle forState:UIControlStateNormal];  // 恢复IDCountDownButton开始倒计时的能力  self.tempDurationOfCountDown = self.durationOfCountDown;  [self.countDownTimer invalidate]; } else {  // 设置IDCountDownButton的title为当前倒计时剩余的时间  [self setTitle:[NSString stringWithFormat:@"%zd秒", self.tempDurationOfCountDown--] forState:UIControlStateNormal]; }}

3)、移除定时器

- (void)dealloc { [self.countDownTimer invalidate];}

使用示例
1)、添加vertificationCodeIDCountDownButton属性

@interface ViewController ()/** 验证码倒计时的button */@property (nonatomic, strong) IDCountDownButton *vertificationCodeIDCountDownButton;@end

2)、创建vertificationCodeIDCountDownButton并进行相关设置

- (void)viewDidLoad { [super viewDidLoad]; // 创建vertificationCodeIDCountDownButton self.vertificationCodeIDCountDownButton = [[IDCountDownButton alloc] initWithFrame:CGRectMake(160, 204, 120, 44)]; // 添加点击事件 [self.vertificationCodeIDCountDownButton addTarget:self action:@selector(vertificationCodeIDCountDownButtonClick:) forControlEvents:UIControlEventTouchUpInside]; // 设置标题相关属性 [self.vertificationCodeIDCountDownButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [self.vertificationCodeIDCountDownButton setTitle:@"获取验证码" forState:UIControlStateNormal]; // 设置背景图片 [self.vertificationCodeIDCountDownButton setBackgroundImage:[UIImage imageNamed:@"redButton"] forState:UIControlStateNormal]; // 设置倒计时时长 self.vertificationCodeIDCountDownButton.durationOfCountDown = 10; // 将vertificationCodeIDCountDownButton添加的控制器的view中 [self.view addSubview:self.vertificationCodeIDCountDownButton];}

3)、实现点击事件触发的操作

- (void)vertificationCodeIDCountDownButtonClick:(UIButton *)button { // TODO:调用服务器接口,获取验证码}

四、关于AppIcon
添加AppIcon时需要遵循以下规则
1)、命名,以Icon开头(首字母大写),跟上@2x/@3x,如图:

2)、尺寸,必须按要求设置尺寸,如图

3)、图中所示的60pt对应的图片尺寸是
2x:120px X 120px
3x:180px X 180px

以上就是本文的全部内容,希望对大家的学习有所帮助。

来源:http://www.tulaoshi.com/n/20160219/1589395.html

延伸阅读
标签: 电脑入门
开机进入windows前,有个选进入操作系统之类的30秒的倒计时,怎样去掉? 步骤方法 右键单击我的电脑,选择属性,弹出系统属性对话框,选择高级选项卡,如图,单击图中红框内的设置按钮。 在弹出的启动和故障恢复对话框中,去除显示操作系统列表的时间前面的勾即可,如图。
标签: Web开发
#oTime {color: blue;font-size: 12px;} [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
代码如下: makeCertPic.java package pic; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; /** * @autho...
标签: Web开发
  生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变)     原型参考ALIBABA  http://china.alibaba.com/member/showimage     产生验证码图片的文件-----image.jsp     %@ page contentType="image/jpeg" import="java.awt.*,jav...

经验教程

467

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部