代码地址如下:
http://www.demodashi.com/demo/11076.html

在做些活动界面或者限时验证码时, 经常会使用一些倒计时突出展现.

现提供两种方案:
一.使用NSTimer定时器来倒计时
二.使用GCD来倒计时(用GCD这个写有一个好处,跳页不会清零, 跳页清零会出现倒计时错误的)

压缩文件截图项目界面:


项目截图:

一. 使用NSTimer定时器来倒计时

主要步骤:
Step1. 计算截止时间与当前时间差
Step2. 先递减时间差 倒计时-1(总时间以秒来计算)
Step3. 给时分秒字符串通过递减过后的秒数,重新计算数值,并输出显示.

获取当天的字符串, 格式为年-月-日 时分秒:

/***  获取当天的字符串**  @return 格式为年-月-日 时分秒*/
- (NSString *)getCurrentTimeyyyymmdd {NSDate *now = [NSDate date];NSDateFormatter *formatDay = [[NSDateFormatter alloc] init];formatDay.dateFormat = @"yyyy-MM-dd HH:mm:ss";NSString *dayStr = [formatDay stringFromDate:now];return dayStr;
}

获取时间差值 截止时间-当前时间:

/***  获取时间差值  截止时间-当前时间*  nowDateStr : 当前时间*  deadlineStr : 截止时间*  @return 时间戳差值*/
- (NSInteger)getDateDifferenceWithNowDateStr:(NSString*)nowDateStr deadlineStr:(NSString*)deadlineStr {NSInteger timeDifference = 0;NSDateFormatter *formatter = [[NSDateFormatter alloc] init];[formatter setDateFormat:@"yy-MM-dd HH:mm:ss"];NSDate *nowDate = [formatter dateFromString:nowDateStr];NSDate *deadline = [formatter dateFromString:deadlineStr];NSTimeInterval oldTime = [nowDate timeIntervalSince1970];NSTimeInterval newTime = [deadline timeIntervalSince1970];timeDifference = newTime - oldTime;return timeDifference;
}

Step1. 计算时间差值:

NSInteger secondsCountDown = [self getDateDifferenceWithNowDateStr:nowStr deadlineStr:deadlineStr];

Step2. 递减时间差 倒计时-1(总时间以秒来计算):

secondsCountDown--;

Step3.活动倒计时:

// 启动倒计时后会每秒钟调用一次方法
_activeTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(activeCountDownAction) userInfo:nil repeats:YES];
[_activeTimer fire];

给时分秒字符串通过递减过后的秒数,重新计算数值,并输出显示:

    // 重新计算 时/分/秒NSString *str_hour = [NSString stringWithFormat:@"%02ld", secondsCountDown / 3600];NSString *str_minute = [NSString stringWithFormat:@"%02ld", (secondsCountDown % 3600) / 60];NSString *str_second = [NSString stringWithFormat:@"%02ld", secondsCountDown % 60];NSString *format_time = [NSString stringWithFormat:@"%@ : %@ : %@", str_hour, str_minute, str_second];// 修改倒计时标签及显示内容self.timeLabel.text = [NSString stringWithFormat:@"使用NSTimer来实现 活动倒计时: %@", format_time];// 当倒计时结束时做需要的操作: 比如活动到期不能提交if(secondsCountDown <= 0) {self.timeLabel.text = @"当前活动已结束";[_activeTimer invalidate];_activeTimer = nil;return;}

NSTimer-活动倒计时测试效果如下:

二. 使用GCD来倒计时

主要步骤:
Step1. 计算截止时间与当前时间差
Step2. 用GCD倒计时 给时分秒字符串通过递减过后的秒数,重新计算数值,并输出显示, 递减时间差 倒计时-1

Step1. 计算截止时间与当前时间差:

    // 倒计时的时间 测试数据NSString *deadlineStr = @"2017-08-19 12:00:00";// 当前时间的时间戳NSString *nowStr = [self getCurrentTimeyyyymmdd];// 计算时间差值NSInteger secondsCountDown = [self getDateDifferenceWithNowDateStr:nowStr deadlineStr:deadlineStr];

Step2.使用GCD来实现倒计时
用GCD这个写有一个好处,跳页不会清零 跳页清零会出现倒计时错误的
活动结束等逻辑及界面处理可以按照自己需求来~

    __weak __typeof(self) weakSelf = self;if (_timer == nil) {__block NSInteger timeout = secondsCountDown; // 倒计时时间if (timeout!=0) {dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0*NSEC_PER_SEC,  0); //每秒执行dispatch_source_set_event_handler(_timer, ^{if(timeout <= 0){ //  当倒计时结束时做需要的操作: 关闭 活动到期不能提交dispatch_source_cancel(_timer);_timer = nil;dispatch_async(dispatch_get_main_queue(), ^{weakSelf.timeLabel.text = @"当前活动已结束";});} else { // 倒计时重新计算 时/分/秒NSInteger days = (int)(timeout/(3600*24));NSInteger hours = (int)((timeout-days*24*3600)/3600);NSInteger minute = (int)(timeout-days*24*3600-hours*3600)/60;NSInteger second = timeout - days*24*3600 - hours*3600 - minute*60;NSString *strTime = [NSString stringWithFormat:@"活动倒计时 %02ld : %02ld : %02ld", hours, minute, second];dispatch_async(dispatch_get_main_queue(), ^{if (days == 0) {weakSelf.timeLabel.text = strTime;} else {weakSelf.timeLabel.text = [NSString stringWithFormat:@"使用GCD来实现活动倒计时            %ld天 %02ld : %02ld : %02ld", days, hours, minute, second];}});timeout--; // 递减 倒计时-1(总时间以秒来计算)}});dispatch_resume(_timer);}}

GCD-活动倒计时测试效果如下:
iOS活动倒计时的两种实现方式

代码地址如下:
http://www.demodashi.com/demo/11076.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

iOS活动倒计时的两种实现方式相关推荐

  1. IOS单例的两种实现方式

    单例模式算是开发中比较常见的一种模式了.在iOS中,单例有两种实现方式(至少我目前只发现两种). 根据线程安全的实现来区分,一种是使用@synchronized ,另一种是使用GCD的dispatch ...

  2. 页面倒计时按钮的两种实现方式

    页面倒计时按钮的两种实现方式: 现假设需求为:点击打开页面后,让用户阅读本页面内容并进行60s倒计时,倒计时结束后用户才可以点击"确定"按钮,进行页面跳转. ①第一种实现方式,打开 ...

  3. Java格式化倒计时的两种方式

    Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...

  4. php闪屏程序,节日闪屏的两种构成方式

    > 摘要: 每逢节日到来,当你打开QQ浏览器,发现有什么不同吗?QQ浏览器已经悄悄的送出了节日的关怀,呈现在你眼前的是朴实而又温情的画面节日闪屏.她是浏览器和用户情感交流的窗口,也 每逢节日到来 ...

  5. 前端与后端,顶象设备指纹的两种接入方式

    在如今的移动互联网时代,用户上网的设备多元化.连接互联网的渠道多样化.接入服务的地点任意化,用户的操作行为个性化,用户设备更加难以被识别和跟踪,由此给广大开展数字化业务的企业,尤其互联网企业带来全新的 ...

  6. 亚马逊收款的两种主要方式

    随着亚马逊平台规模越来越大,现在入驻亚马逊的卖家数量也急剧增多.得益于这几年的电商行业的快速发展,现在亚马逊收款的技术也已经十分成熟,对于亚马逊卖家来说,目前亚马逊收款主要为两种方式. 一.官方的亚马 ...

  7. C++中的两种绑定方式(静态绑定、动态绑定)

    两种绑定方式 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类. 动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类. ...

  8. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  9. (C++)string 的两种输入方式和输出方式

    注:头文件如下 #include<string> #include<cstdio> #include<iostream>using namespace std; 注 ...

最新文章

  1. 用户体验改善案例_如何检测用户的设备,以便改善他们的用户体验
  2. AI一分钟 | 搜狗王小川:今年重点战略是输入法升级和发展机器翻译;北京无人驾驶试验场下半年正式运营
  3. windows下用QTwebkit解析html
  4. 下载Google Play中的APK
  5. VMware ubuntu 虚拟机只剩下lo回环网卡,上不了网(无法上网、无法连接网络)(环回)
  6. logback 常用配置详解(二) appender
  7. java反多态的代码_Java多态性代码详解
  8. C# new()约束简单介绍
  9. pmp中ram和raci的区别_【PMP知识点总结】采购流程、采购合同的类型、采购合同的条款...
  10. 如何将 png 图片转换为 eps ?
  11. php登入模块代码,thinkphp LoginAction.class.php 登录模块
  12. [转贴]Linux新增用户和组
  13. vlc linux静态版本,vlc 在ubuntu 14下的linux版本编译
  14. java jxls_java操作excel及jxls(Z)
  15. 微信公众号程序开发接入流程
  16. 《你可能不知道免像控的两个细节问题》
  17. 亚马逊云服务器防火墙,Amazon WAF | Web 应用程序防火墙 | 亚马逊云科技
  18. UOJ #11. 【UTR #1】ydc的大树
  19. STM32 CAN总线通信学习笔记(一)
  20. 面试官常问的问题及回答

热门文章

  1. 子类怎么继承父类方法中的变量_关于继承的那些事!
  2. leecode-12整数转化为罗马数字C版
  3. Monocular slam 中的理论基础(2)
  4. 虚拟机状态错误_【行业资讯】VirtualBox 6.1.16 发布,开源虚拟机
  5. memcache面试
  6. 我想站在巨人的肩上——记成都之行
  7. Nginx+Tomcat动静分离
  8. System.load(String filename)和System.loadLibrary(String libname)的区别
  9. C3P0连接池详细配置
  10. Oracle 10g新特性