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

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

一、实现效果
如图

二、实现思路
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的值

- (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

以上就是本文的全部内容,大家也可以结合第二篇IOS实现验证码倒计时功能(二)进行学习,希望对大家的学习有所帮助。

(0)

相关推荐

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

    验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来实现验证码倒计时的效果,定义一个发送验证码的按钮,添加点击事件,具体内容如下 具体代码: 定义一个发送验证码的按钮,添加点击事件 //发送验证码按钮 _sentCodeBtn = [[UIButton alloc] initWithFrame:CGRectMake(kScreenWidth - 27 - 4 - 94, CGRectGetMinY(_registerCodeFD.frame) + 4, 94, 40)]; [_sentCo

  • iOS 验证码按钮倒计时功能

    在app 注册或者登录 需要验证码的地方.为了避免短时间内刷验证码.往往会加上一层验证. 倒计时结束后.可以重新获取! 代码实现如下: // _CountdownTime 倒计时总时间: //_timer 定时器 - (void)startTime:(UIButton *)VerificationCodeButton { __block NSInteger timeout = [_CountdownTime integerValue]; dispatch_queue_t queue = disp

  • iOS获取短信验证码倒计时的两种实现方法

    方法一: 网上用的很多的一种,不多说,直接上代码. -(void)startTime{ __block int timeout= 60; //倒计时时间 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,qu

  • Swift实现iOS应用中短信验证码倒计时功能的实例分享

    在开始之前,我们先来了解一个概念 属性观测器(Property Observers): 属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外. 可以为属性添加如下的一个或全部观察器: willSet在新的值被设置之前调用 didSet在新的值被设置之后立即调用 接下来开始我们的教程,先展示一下最终效果: 首先声明一个发送按钮: 复制代码 代码如下: var sendButton: UIButton! 在viewDidLoad方法中给发

  • iOS获取验证码倒计时效果

    本文实例为大家分享了iOS倒计时获取验证码的具体代码,供大家参考,具体内容如下 1. 倒计时发送验证码,界面跳转计时会重置 /**重新发送短信的计时*/ -(void)fireTimer{ __block int timeout=180; //倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t _timer = dispatc

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

    验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来写一个IDCountDownButton来实现验证码倒计时的效果.你可以想使用普通的UIButton类型按钮一样,只需要设置其倒计时时长(若未设置,默认为60秒),就可以轻松的实现点击countDownButton开始倒计时,倒计时结束方可重新点击. 一.实现效果 如图 二.实现思路 1.自定义一个IDCountDownButton,重写 beginTrackingWithTouch:withEvent: 拦截button的点击事件,根据

  • swift 3.0 实现短信验证码倒计时功能

    下面一段代码给大家分享swift 3.0 实现短信验证码倒计时功能,具体实例代码如下所示: class TCCountDown { private var countdownTimer: Timer? var codeBtn = UIButton() private var remainingSeconds: Int = 0 { willSet { codeBtn.setTitle("重新获取\(newValue)秒", for: .normal) if newValue <=

  • JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)

    1.功能描述 当用户想要获取验证码时,就点击 免费获取验证码 ,然后开始倒计时,倒计时期间按钮文字为剩余时间x秒,且不可按状态,倒计时结束后,按钮更改为点击重新发送. 2.分析 必须用到定时器.按钮点击后,在定时器内做出判断.倒计时60秒,到0结束. 3.代码实现: 重点介绍:定时器在进行下一次倒计时之前,一定要清除一下,这样的话保证下一次定时器倒计时是正常的. <!DOCTYPE html> <html> <head> <meta charset="U

  • Android实现获取验证码倒计时功能

    本文实例为大家分享了android获取验证码倒计时功能的具体代码,供大家参考,具体内容如下 获取验证码倒计时在现在的App中非常常见,他主要的功能点就是给TextView设置一个点击事件,但是当点击后或出现倒计时,在倒计时的时候点击是触发不了点击事件的. 等倒计时结束显示重新获取验证码的时候可以重新触发点击事件: 在真实的项目中一般都是设置一分钟,咱们这里就不设置那么长了,设置10秒: 首先说下我这个demo非常简单,工具类不用管,直接复制到项目中,只需要两步两行代码即可: 第一步:初始化工具类

  • android实现一个图片验证码倒计时功能

    1.如图所示,要实现一个验证码的倒计时的效果          2.实现 图中获取验证码那块是一个button按钮 关键部分,声明一个TimeCount,继承自CountDownTimer /*验证码倒计时*/ private class TimeCount extends CountDownTimer{ /** * @param millisInFuture 总时间长度(毫秒) * @param countDownInterval 时间间隔(毫秒),每经过一次时间间隔都会调用onTick方法

  • Android 简单封装获取验证码倒计时功能

    效果如下图所示: 如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用 CountDownTimer 定时器简单封装下此效果,方便我们随时调用. 首页先在 attrs.xml 中定义下所需的几个属性: <resources> <declare-styleable name="CountDownButton"> <attr name="millisinfuture" format="integer&q

  • 微信小程序项目实践之验证码倒计时功能

    效果如下:点击发送验证码按钮,按钮背景变色,不可点击,显示倒计时文字 首先js文件的data里面 声明一个变量用于表示当前是否可以点击,codeIsCanClick = true,  默认是可以点击的 写下界面代码: wxml文件中 <view class='centerRow'> <view class='inputLabel'>动态码:</view> <input class='inputStyle' style="flex:1 " bin

  • JS 实现获取验证码 倒计时功能

    setInterval 一个定时器搞定 <style> button{ background: #45BCF9; color: #fff; padding: 4px 10px; border: none; outline: none; cursor: pointer; } button:hover{ background: #00a8fe; } button.disabled{ background: #000; cursor: auto; } button.disabled:hover{ b

随机推荐