iOS活动倒计时的两种实现方式 布满荆棘的人生 2022-05-29 23:19 704阅读 0赞 > 代码地址如下: > [http://www.demodashi.com/demo/11076.html][http_www.demodashi.com_demo_11076.html] #### 在做些活动界面或者限时验证码时, 经常会使用一些倒计时突出展现. #### ![efvmzoHzpS9S6McNZX6.png][] > 现提供两种方案: > 一.使用NSTimer定时器来倒计时 > 二.使用GCD来倒计时(用GCD这个写有一个好处,跳页不会清零, 跳页清零会出现倒计时错误的) **压缩文件截图项目界面:** ![ylpJnpOXUutXzG0SQtf.png][] **项目截图:** ![BY0dMrrl3OfaiVpaP4s.png][] ## 一. 使用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-活动倒计时测试效果如下:** ![iDgwsijNeA2A4q1WNpv.gif][] ## 二. 使用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-活动倒计时测试效果如下:** ![YLtbxLqiaVZERl2HfuL.gif][]iOS活动倒计时的两种实现方式 > 代码地址如下: > [http://www.demodashi.com/demo/11076.html][http_www.demodashi.com_demo_11076.html] > > 注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权 [http_www.demodashi.com_demo_11076.html]: http://www.demodashi.com/demo/11076.html [efvmzoHzpS9S6McNZX6.png]: /images/20220530/5437713a3dfb4384b20bde003d5ad203.png [ylpJnpOXUutXzG0SQtf.png]: /images/20220530/dbab506b83ce4767bd54d553b4b38c43.png [BY0dMrrl3OfaiVpaP4s.png]: /images/20220530/f67a3205f71b4d5cb826e8c28b448518.png [iDgwsijNeA2A4q1WNpv.gif]: /images/20220530/f2ec5f92bbeb47da86286a9ad8ac18c4.png [YLtbxLqiaVZERl2HfuL.gif]: /images/20220530/5b662d5c555c48d684885c5fe1fed9bd.png
相关 Java倒计时的简单实现方式 Java倒计时的简单实现方式 在Java中,我们可以使用多种方法来实现倒计时。下面我将介绍一种简单的实现方式,并提供相应的源代码。 实现倒计时的基本思路是:使用循环结构,每 我会带着你远行/ 2024年03月08日 03:49/ 0 赞/ 134 阅读
相关 java 倒计时实现的方式 ![ae69cb5d853f43279ff40b9bf13df107.jpeg][] 倒计时的实现方法有很多种,本文给大家介绍其中一种,最简单的一种实现方式,也是最方便的一种 妖狐艹你老母/ 2023年10月09日 20:57/ 0 赞/ 60 阅读
相关 实现Unity游戏倒计时的两种方法 using System.Collections; using System.Collections.Generic; using UnityEngine; 短命女/ 2023年05月21日 11:50/ 0 赞/ 32 阅读
相关 Android实现倒计时的几种方式。 一、handler方式 int time = 10 ; Handler handler =new Handler(){ public v 朴灿烈づ我的快乐病毒、/ 2023年01月08日 03:22/ 0 赞/ 175 阅读
相关 Android实现计时与倒计时的几种方法 ![Center][] 方法一 Timer与TimerTask(Java实现) public class timerTask extends Activity{ 待我称王封你为后i/ 2022年09月22日 03:57/ 0 赞/ 229 阅读
相关 砍价倒计时活动手机页面 [下载地址][Link 1]精美的手机砍价活动页面,呼朋唤友来砍价点击按钮“帮他砍一刀”,商品砍价倒计时手机页面模板html下载。 ![1631561433.png][] 男娘i/ 2022年09月11日 13:24/ 0 赞/ 261 阅读
相关 iOS活动倒计时的两种实现方式 > 代码地址如下: > [http://www.demodashi.com/demo/11076.html][http_www.demodashi.com_demo_110 布满荆棘的人生/ 2022年05月29日 23:19/ 0 赞/ 704 阅读
相关 商品倒计时活动 var content = document.getElementById("content") //开始时间 当前时间 var nowTime = 今天药忘吃喽~/ 2021年12月12日 03:41/ 0 赞/ 405 阅读
相关 vue 活动倒计时组件 1. 这是倒计时封装好的组件 这里我们命名 countdown.vue <template> <div> <p v-if="msTime 一时失言乱红尘/ 2021年09月17日 04:22/ 0 赞/ 538 阅读
相关 活动倒计时封装函数 直接贴代码 //e:结束的时间,是一个时间戳类似156654646545 //obj:放置倒计时的dom节点 //skin:倒计时的格式''ww_1' 骑猪看日落/ 2021年09月14日 13:22/ 0 赞/ 445 阅读