iOS活动倒计时的两种实现方式
代码地址如下:
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活动倒计时的两种实现方式相关推荐
- IOS单例的两种实现方式
单例模式算是开发中比较常见的一种模式了.在iOS中,单例有两种实现方式(至少我目前只发现两种). 根据线程安全的实现来区分,一种是使用@synchronized ,另一种是使用GCD的dispatch ...
- 页面倒计时按钮的两种实现方式
页面倒计时按钮的两种实现方式: 现假设需求为:点击打开页面后,让用户阅读本页面内容并进行60s倒计时,倒计时结束后用户才可以点击"确定"按钮,进行页面跳转. ①第一种实现方式,打开 ...
- Java格式化倒计时的两种方式
Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...
- php闪屏程序,节日闪屏的两种构成方式
> 摘要: 每逢节日到来,当你打开QQ浏览器,发现有什么不同吗?QQ浏览器已经悄悄的送出了节日的关怀,呈现在你眼前的是朴实而又温情的画面节日闪屏.她是浏览器和用户情感交流的窗口,也 每逢节日到来 ...
- 前端与后端,顶象设备指纹的两种接入方式
在如今的移动互联网时代,用户上网的设备多元化.连接互联网的渠道多样化.接入服务的地点任意化,用户的操作行为个性化,用户设备更加难以被识别和跟踪,由此给广大开展数字化业务的企业,尤其互联网企业带来全新的 ...
- 亚马逊收款的两种主要方式
随着亚马逊平台规模越来越大,现在入驻亚马逊的卖家数量也急剧增多.得益于这几年的电商行业的快速发展,现在亚马逊收款的技术也已经十分成熟,对于亚马逊卖家来说,目前亚马逊收款主要为两种方式. 一.官方的亚马 ...
- C++中的两种绑定方式(静态绑定、动态绑定)
两种绑定方式 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类. 动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类. ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...
- (C++)string 的两种输入方式和输出方式
注:头文件如下 #include<string> #include<cstdio> #include<iostream>using namespace std; 注 ...
最新文章
- 用户体验改善案例_如何检测用户的设备,以便改善他们的用户体验
- AI一分钟 | 搜狗王小川:今年重点战略是输入法升级和发展机器翻译;北京无人驾驶试验场下半年正式运营
- windows下用QTwebkit解析html
- 下载Google Play中的APK
- VMware ubuntu 虚拟机只剩下lo回环网卡,上不了网(无法上网、无法连接网络)(环回)
- logback 常用配置详解(二) appender
- java反多态的代码_Java多态性代码详解
- C# new()约束简单介绍
- pmp中ram和raci的区别_【PMP知识点总结】采购流程、采购合同的类型、采购合同的条款...
- 如何将 png 图片转换为 eps ?
- php登入模块代码,thinkphp LoginAction.class.php 登录模块
- [转贴]Linux新增用户和组
- vlc linux静态版本,vlc 在ubuntu 14下的linux版本编译
- java jxls_java操作excel及jxls(Z)
- 微信公众号程序开发接入流程
- 《你可能不知道免像控的两个细节问题》
- 亚马逊云服务器防火墙,Amazon WAF | Web 应用程序防火墙 | 亚马逊云科技
- UOJ #11. 【UTR #1】ydc的大树
- STM32 CAN总线通信学习笔记(一)
- 面试官常问的问题及回答
热门文章
- 子类怎么继承父类方法中的变量_关于继承的那些事!
- leecode-12整数转化为罗马数字C版
- Monocular slam 中的理论基础(2)
- 虚拟机状态错误_【行业资讯】VirtualBox 6.1.16 发布,开源虚拟机
- memcache面试
- 我想站在巨人的肩上——记成都之行
- Nginx+Tomcat动静分离
- System.load(String filename)和System.loadLibrary(String libname)的区别
- C3P0连接池详细配置
- Oracle 10g新特性