倒计时功能的实现

原创 2016年08月30日 13:42:53

0行代码实现倒计时功能。

该demo 的实现过程如下,注意提示框使用了MBProgressHUD,在这里对作者表示感谢,需要自己导入到项目。

示例GIF:


.h 文件

#import <UIKit/UIKit.h>

@interface CCPCountDownButton :UIButton

/**验证码倒计时的时长 */

@property (nonatomic,assign)NSInteger durationOfCountDown;

//原始字体颜色

@property (nonatomic,strong)UIColor *originalColor;

//倒计时字体颜色

@property (nonatomic,strong)UIColor *processColor;

@end

-----------------------------------------------------------------

.m 文件

#import "CCPCountDownButton.h"

#import "MBProgressHUD.h"

@interfaceCCPCountDownButton ()

/** 保存起始状态下的title */

@property (nonatomic,copy)NSString *originalTitle;

/**保存倒计时的时长 */

@property (nonatomic,assign)NSInteger tempDurationOfCountDown;

/** 定时器对象 */

@property (nonatomic,strong)NSTimer *ccpCountDownTimer;

/**避免开始计时时快速连续点击显示问题 */

@property (nonatomic,assign)int count;

@end

@implementation CCPCountDownButton

/**

 *   注意事项:

 *  XIB,SB,或者是在代码中创建Button的时候,Button的样式要设置成为 Custom样式,否则在倒计时过程中 ButtonTittle会闪动.

 */

- (void)setTitle:(NSString *)title forState:(UIControlState)state {

    [super setTitle:titleforState:state];

    // 倒计时过程中title的改变不更新originalTitle

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

        self.originalTitle = title;

        

        self.originalColor =self.titleLabel.textColor;

    }

}


- (void)setDurationOfCountDown:(NSInteger)durationOfCountDown {

    _durationOfCountDown = durationOfCountDown;

    self.tempDurationOfCountDown =_durationOfCountDown;

}


- (void)setOriginalColor:(UIColor *)originalColor {

    

    _originalColor = originalColor;

   

    [selfsetTitleColor:originalColorforState:UIControlStateNormal];

}


- (void)setProcessColor:(UIColor *)processColor {

    

    _processColor = processColor;

    

}


- (instancetype)initWithFrame:(CGRect)frame {

    if (self = [superinitWithFrame:frame]) {

        

        if (self.originalColor) {

            

            [selfsetTitleColor:self.originalColorforState:UIControlStateNormal];

        } else {

            

            //默认颜色红色

            [selfsetTitleColor:[UIColorredColor]forState:UIControlStateNormal];

        }

        

        self.count =0;

        // 设置默认的倒计时时长为60

        self.durationOfCountDown =60;

        // 设置button的默认标题为获取验证码

        [selfsetTitle:@"获取验证码"forState:UIControlStateNormal];

    }

    returnself;

}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    if (self = [superinitWithCoder:aDecoder]) {

       

        if (self.originalColor) {

            [selfsetTitleColor:self.originalColorforState:UIControlStateNormal];

        } else {

            //默认颜色红色

            [selfsetTitleColor:[UIColorredColor]forState:UIControlStateNormal];

            

        }


        self.count =0;

        // 设置默认的倒计时时长为60

        self.durationOfCountDown =60;

        // 设置button的默认标题为获取验证码

        [selfsetTitle:@"获取验证码"forState:UIControlStateNormal];

    }

    returnself;

}


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

    self.count ++;

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

    if (self.tempDurationOfCountDown !=self.durationOfCountDown||self.count !=1) {

        

        self.count =0;

        [self HUD];

        return NO;

    }

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

    [selfstartCountDown];

    return [superbeginTrackingWithTouch:touchwithEvent:event];

}


//创建定时器,开始倒计时

- (void)startCountDown {

    

    // 创建定时器

    self.ccpCountDownTimer = [NSTimertimerWithTimeInterval:1target:selfselector:@selector(updateCCPCountDownButtonTitle)userInfo:nilrepeats:YES];

   //将定时器添加到当前的RunLoop中(自动开启定时器)

    [[NSRunLoopcurrentRunLoop]addTimer:self.ccpCountDownTimerforMode:NSRunLoopCommonModes];

}

//更新CCPCountDownButtontitle为倒计时剩余的时间

- (void)updateCCPCountDownButtonTitle {

    if (self.tempDurationOfCountDown ==0) {

        // 设置CCPCountDownButtontitle为开始倒计时前的title

        [selfsetTitle:self.originalTitleforState:UIControlStateNormal];

        [selfsetTitleColor:self.originalColorforState:UIControlStateNormal];

        // 恢复CCPCountDownButton开始倒计时

        self.tempDurationOfCountDown =self.durationOfCountDown;

        [self.ccpCountDownTimerinvalidate];

        self.count =0;

    } else {

        // 设置CCPCountDownButtontitle为当前倒计时剩余的时间

        [selfsetTitle:[NSStringstringWithFormat:@"重新发送(%zds)",self.tempDurationOfCountDown--]forState:UIControlStateNormal];

        

        

        if (self.processColor) {

            

            [selfsetTitleColor:self.processColorforState:UIControlStateNormal];

            

        } else {

            //默认颜色蓝色

            [selfsetTitleColor:[UIColorblueColor]forState:UIControlStateNormal];


        }

    }

}


- (void)HUD {

    MBProgressHUD *hud = [MBProgressHUDshowHUDAddedTo:self.superview.windowanimated:YES];

    // Set the annular determinate mode to show task progress.

    hud.mode =MBProgressHUDModeText;

    hud.label.text = [NSStringstringWithFormat:@",%lds之内请勿重复操作",(long)self.durationOfCountDown];

//    NSLocalizedString(@",60s之内请勿重复操作", @"HUD message title");

    // Move to bottm center.

    hud.offset =CGPointMake(0.f,MBProgressMaxOffset);

    [hud hideAnimated:YESafterDelay:2.f];

}


- (void)dealloc {

    

    [self.ccpCountDownTimerinvalidate];

}

@end


使用详情见DEMO。
DEMO地址:https://github.com/IMCCP/CCPCountdownDemo

如果该demo对你有帮助,请 Star 一下吧!


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

delphi 带倒计时的自动关闭

delphi 带倒计时的自动关闭 1>.新建工程,添加控件:         放一个Edit控件(edt1)和一个button控件(button1)和,还有一个Label控件(Lbl_Time...

Delphi中用MessageBox()API函数做倒计时对话框。

API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭。const  IDTIMEDOUT = 32000;function MessageBoxTime...
  • zswang
  • zswang
  • 2008年10月15日 18:27
  • 5042

js实现倒计时功能

js实现倒计时功能

增强UIWebView的cache

尝试了一下增强UIWebView的cache。不过实际效果并不理想。即便有cache,消除了从新联网请求都时间,但是重新排版时间仍然很长。UIWebView对前进后退都响应速度没明显改善。 这里介绍简...
  • slavik
  • slavik
  • 2010年11月18日 01:53
  • 4355

对于xcode8打包上传出现的问题留下纪念

1. 对于90682的第一个问题:ERROR ITMS-90682: "Invalid Bundle. The asset catalog at '$path' can't contain 16-bi...

利用jq实现倒计时功能

  • 2015年08月17日 15:04
  • 4KB
  • 下载

C语言实现天数倒计时功能

  • 2016年03月21日 09:28
  • 2KB
  • 下载

Android 倒计时功能的实现(CountDownTimer)

 CountDownTimer 结构 继承关系 public abstract class CountDownTimer extends Object     java.lang.Ob...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:倒计时功能的实现
举报原因:
原因补充:

(最多只允许输入30个字)