验证码倒计时

来源:互联网 发布:手机复制软件下载 编辑:程序博客网 时间:2024/05/17 01:24

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

一、实现效果
如图



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

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

私有属性

?
1
2
3
4
5
6
7
8
@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的值

?
1
2
3
4
5
6
7
- (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是否具备重新开始倒计时的能力

?
1
2
3
4
- (void)setDurationOfCountDown:(NSInteger)durationOfCountDown {
 _durationOfCountDown = durationOfCountDown;
 self.tempDurationOfCountDown = _durationOfCountDown;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (instancetype)initWithFrame:(CGRect)frame {
 if(self = [super initWithFrame:frame]) {
  // 设置默认的倒计时时长为60秒
  self.durationOfCountDown = 60;
  // 设置button的默认标题为“获取验证码”
  [self setTitle:@"获取验证码"forState:UIControlStateNormal];
 }
 returnself;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
 if(self = [super initWithCoder:aDecoder]) {
  // 设置默认的倒计时时长为60秒
  self.durationOfCountDown = 60;
  // 设置button的默认标题为“获取验证码”
  [self setTitle:@"获取验证码"forState:UIControlStateNormal];
 }
 returnself;
}

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

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

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

?
1
2
3
4
5
6
- (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为倒计时剩余的时间

?
1
2
3
4
5
6
7
8
9
10
11
12
- (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)、移除定时器

?
1
2
3
- (void)dealloc {
 [self.countDownTimer invalidate];
}

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (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)、实现点击事件触发的操作

?
1
2
3
- (void)vertificationCodeIDCountDownButtonClick:(UIButton *)button {
 // TODO:调用服务器接口,获取验证码
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 种粮大户没粮仓怎么办? 公司不发高温费怎么办 低保户没低保证怎么办 鸿运当头花干了怎么办 鸿运当头花谢了怎么办 鸿运当头花不红怎么办 众筹项目失败了怎么办 孕妇头发白了怎么办呢 猕猴桃坏了吃了怎么办 猕猴桃买的太硬怎么办 金艳猕猴桃很硬怎么办 猕猴桃又硬又酸怎么办 2岁宝宝生长缓慢怎么办 婴儿体重长得慢怎么办 人吃了乌药中毒怎么办 水中的氧气过少怎么办 怀孕9个月血糖高怎么办 怀孕的人血糖高怎么办 来月经很痛该怎么办 月经来了好痛怎么办 花呗额度用完了怎么办 老人长期卧床长了褥疮怎么办 5岁宝宝嗓子哑了怎么办 2岁宝宝喉咙嘶哑怎么办 1岁宝宝嗓子哑了怎么办 3个月婴儿嗓子哑怎么办 小孩一感冒就喘怎么办 狗打双黄连过敏怎么办 过敏怎么办怎么好的快 铁木砧板变形了怎么办 水泥地面起沙严重怎么办 横厅沙发不靠墙怎么办 吃多了胃疼怎么办 龙血树叶子干枯怎么办 龙血树叶尖发黄怎么办 茶花叶子掉光了怎么办 鸡虱子爬人身上怎么办 鸡的身上有虱子怎么办 鸡跳蚤在人身上怎么办 猫虱子到人身上怎么办 大人头上长虱子怎么办