倒计时功能的实现

原创 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 一下吧!


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

iOS——MBProgressHUD的使用方法

MBProgressHUD就是一个非常好用的第三方库,可以快速接入加载的界面,下面贴代码: #import "ViewController.h" #import "MBProgressHUD.h" ...
  • w582324909
  • w582324909
  • 2016年12月08日 16:15
  • 684

MBProgressHUD+MJ的简单使用

今天在写项目的时候,发现了这个框架.这应该是 MJ 老师封装的.在这里,谢谢 MJ 老师. 这是. h 文件里面的内容.+ (void)showSuccess:(NSString *)success...
  • Liuhuaixuan
  • Liuhuaixuan
  • 2016年06月06日 16:59
  • 2327

iOS——MBProgressHUD的使用方法

MBProgressHUD就是一个非常好用的第三方库,可以快速接入加载的界面,下面贴代码: #import "ViewController.h" #import "MBProgressHUD.h" ...
  • w582324909
  • w582324909
  • 2016年12月08日 16:15
  • 684

iOS中 简单易懂的秒杀倒计时/倒计时

iOS中 简单易懂的秒杀倒计时/倒计时 商城类APP常用的秒杀倒计时 /iOS倒计时...
  • qq_31810357
  • qq_31810357
  • 2016年02月19日 20:57
  • 10345

iOS开发-三种倒计时的写法

1.通过NSThread的performSelectorInBackground; 2.通过定时器,属于比较简单的写法; 3.通过GCD中的dispatch_source;先说第一种:#impor...
  • CodingFire
  • CodingFire
  • 2016年08月26日 16:40
  • 10819

秒杀活动倒计时 iOS代码实现

IOS关于大型网站抢购、距活动结束,剩余时间倒计时的实现代码,代码比较简单,大家根据需求适当的添加修改删除代码 1.定义4个 Label 来接收倒计时...
  • qq_19678579
  • qq_19678579
  • 2017年05月09日 16:02
  • 942

倒计时工具类,listview的item计时器

listview中的item,倒计时,设置倒计时时长及倒计时间隔
  • mengshirui_
  • mengshirui_
  • 2016年06月29日 12:57
  • 1402

PHP+HTML实现登出界面倒计时效果

在WAMP(Windows+Apache+MySQL+PHP)做网站时,通常需要使用Session记录表单登陆用户名和密码等变量,而在登出时需要清除Session。通常我想实现的登出是通过alert提...
  • Eastmount
  • Eastmount
  • 2015年02月21日 22:59
  • 3052

小程序自学系列(零基础学小程序002)---小程序实现电商秒杀倒计时效果

小程序自学系列(零基础学小程序002)---小程序实现电商秒杀倒计时效果
  • qiushi_1990
  • qiushi_1990
  • 2016年11月25日 15:43
  • 1748

Android验证码倒计时实现方式总结

Android验证码倒计时实现方式总结        几乎所有的APP里面都有验证码倒计时按钮,自己在项目中也尝试,简单总结为以下三种: 1、使用线程和Handler的方式,定时刷新倒计时数字,这...
  • zhimingshangyan
  • zhimingshangyan
  • 2016年11月01日 18:15
  • 4026
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:倒计时功能的实现
举报原因:
原因补充:

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