倒计时功能的实现

原创 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中用MessageBox()API函数做倒计时对话框。

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

delphi 带倒计时的自动关闭

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

自行整理了一个较为准确的倒计时功能代码(js实现)

在做这个之前,网上查找了很多的倒计时代码,但是都非常的不精确,对于精确度不高的一些倒计时上边还都可以,但是如果精确度一上去,立马就是会出bug,自己外加查阅资料在联合实际写了一个倒计时代码,这套代码有...

web倒计时代码

JS循环倒计时 距离活动结束还有: 天 时 ...

web端用js实现倒计时

[html] view plain copy html>       head>        ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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