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

2020-01-14 18:18:40刘景俊

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];
 }
}