iOS-实现验证码倒计时功能(1)

验证码倒计时按钮的应用是非常普遍的,该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];

 }

 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的点击事件;否则,不响应且不传递。

?


1

2

3

4

5

6

7

8

9

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {

 // 若正在倒计时,不响应点击事件

 if (self.tempDurationOfCountDown != self.durationOfCountDown) {

  return NO;

 }

 // 若未开始倒计时,响应并传递点击事件,开始倒计时

 [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:调用服务器接口,获取验证码

}

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

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

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

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

时间: 2024-10-10 03:56:03

iOS-实现验证码倒计时功能(1)的相关文章

Android开发:验证码倒计时功能实现

前言 现在好多个APP里面都有验证码倒计时按钮,实现方式大概有下面几种: 1.使用线程和Handler的方式,定时刷新倒计时数字,这种方式容易导致内存泄露,所以一般都使用弱引用,控制数字的刷新. 2.自定义倒计时按钮 3.使用Android提供的CountDownTimer结合TextView实现倒计时功能 这篇主要就是说下用第三种方式实现,简单好用 效果图 实现 以下是核心代码: /** * Created by hfs on 2017/5/9. */ public class TimeCou

iOS开发—验证码倒计时

__block int timeout=59; //倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); dispatch_source_set_timer(timer,dispatch

iOS 短信验证码倒计时按钮的实现

验证码倒计时按钮的应用是非常普遍的,本文介绍了IOS实现验证码倒计时功能,点击获取验证码,进入时间倒计时,感兴趣的小伙伴们可以参考一下: 实现思路: 创建按钮,添加点击方法: 用NSTimer定时器,每秒执行一次,定时改变Button的title,改变Button的样式,设置Button不可点击: 若倒计时结束,定时器关闭,并改变Button的样式,可以点击: 代码如下: 在按钮的点击事件里调用该方法      -(void)openCountdown{ __block NSInteger ti

iOS 按钮倒计时功能

iOS 按钮倒计时功能, 建议把按钮换成label,这样会避免读秒时闪烁 1 __block int time = 60; 2 __block UIButton *verifybutton = _GetverificationBtn; 3 verifybutton.enabled = NO; 4 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 5 dispatch_so

react native中的聊天气泡以及timer封装成的发送验证码倒计时

今天看来情书写的文章,研究了一下大佬写的文章,自己做一点总结. 其实,今天我想把我近期遇到的坑都总结一下:1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以用navigationActions     2.父子组件的传值,一可以用callBack  二可以用pubsub发布订阅模式 三可以用manager事件监听(a页面要显示的内容 有两种形式,一是从manager主动接收,也就是说不需要点击什么的获取数据,而是时时监听manager里数据的变化,第二

Andorid实现点击获取验证码倒计时效果

这篇文章主要介绍了Andorid实现点击获取验证码倒计时效果,这种效果大家经常遇到,想知道如何实现的,请阅读本文 我们在开发中经常用到倒计时的功能,比如发送验证码后,倒计时60s再进行验证码的获取,为了方便以后使用,这里做个记录,讲讲倒计时器的实现. 1.先进行倒计时工具类的封装 1 public class CountDownTimerUtils extends CountDownTimer { 2 private TextView mTextView; 3 4 /** 5 * @param

iOS开源项目MobileProject功能点介绍

一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileProject对于项目的搭建也进行很明确的划分,各个模块职责也比较明确,MobileProject也引入的一些常用第三方插件.宏定义.工具帮助类等:整个项目也是在不断更新跟维护中,功能点也会不断更新:代码支持iOS7以后版本: 二:项目框架内容 三:功能点介绍 1:JSPatch热更新功能 相信关于J

iOS开发--验证码

第一步,拖两个空间textfiled和button到storyboard上的viewcontroller上. 第二步,拖线,链接到.h文件中代码如下: 1 @property (weak, nonatomic) IBOutlet UIButton *l_timeButton; 第三步,在,m文件中为l_timeButton设置监听器,监听点击事件. 1 2 3 4 - (void)viewDidLoad {     [super viewDidLoad];     [_l_timeButton

【Android】验证码倒计时(Service完成,页面切换不中断)

[Android]验证码倒计时(Service完成,页面切换不中断) Service+CountDownTimer+Handler完成倒计时功能,页面切换不中断. 下载地址:http://www.devstore.cn/code/info/598.html