iOS中倒计时
方法一:使用NSTimer来实现(比较适用于发送短信验证码倒计时)
主要是利用NSTimer的scheduledTimerWithTimeInterval方法来每秒执行一次changeTime方法
//创建一个Timer,每秒执行一次changeTime:方法
NSTimer * timer =[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(changeTime:) userInfo:nil repeats:YES];
//changeTime
-(void)changeTime:(NSTimer*)timer
{
//点击获取验证码的btn
UIButton * button = (UIButton*)[self.view viewWithTag:99];
if (count == 0) {
//完成后invalidate掉
[timer invalidate];
//59s倒计时
count = 59;
[button setTitle:@"重新获取" forState:UIControlStateNormal];
button.userInteractionEnabled = YES;
button.alpha = 1;
}
else{
[button setTitle:[NSString stringWithFormat:@"%d s",count] forState:UIControlStateNormal];
count--;
}
}
方法二:使用 GCD 来实现(比较使用于商家做某种活动的倒计时)
.h文件中定义一个Timer来控制时间
//倒计时Timer
dispatch_source_t _timer;
.m文件中实现:
//创建一个时间戳
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
//时间戳的格式
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
//将相同时间戳格式的NSString类型的数据转换成NSDate类型的数据
NSDate *endDate = [dateFormatter dateFromString:_EndTime];
NSDate *startDate = [dateFormatter dateFromString:_StartTime];
NSDate *currentDate = [dateFormatter dateFromString:_CurrentTime];
//计算服务器当前时间距离活动结束的时间戳
NSTimeInterval timeInterval =[endDate timeIntervalSinceDate:currentDate];
//计算服务器当前时间与活动开始时间的时间戳
NSTimeInterval StartToNow = [currentDate timeIntervalSinceDate:startDate];
//倒计时时间
__block int timeout = timeInterval;
__block int StartTimeout = StartToNow;
if (timeout!=0) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 并行队列
// 并行队列可以同时处理多个任务,在不得以的情况下可以用dispatch_queue_create创建,但一般我们都要用系统预定义的并行队列,即全局队列(Global // Concurrent Dispatch Queues)。目前系统预定义了四个不同运行优先级的全局队列,我们可以通过dispatch_get_global_queue来获取它们。
//dispatch_get_global_queue第一个参数是队列的优先级,分别对应四个全局队列:
//DISPATCH_QUEUE_PRIORITY_HIGH
//DISPATCH_QUEUE_PRIORITY_DEFAULT
//DISPATCH_QUEUE_PRIORITY_LOW
//DISPATCH_QUEUE_PRIORITY_BACKGROUND
//dispatch_get_global_queue中第二个参数目前系统保留,请设置为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 || StartTimeout <=0){
dispatch_source_cancel(_timer);
_timer = nil;
//在队列中运行任务
//你可以随时向一个队列中添加一个新任务,只需要调用一下dispatch_async即可:
dispatch_async(dispatch_get_main_queue(), ^{
//可以根据自己需求设计需要显示的内容及展现格式、风格等
dayLabel.text = @"0天";
hourLabel.text = @"00 :";
minLabel.text = @"00 :";
secLabel.text = @"00";
label.text = @"抢购结束!!!";
});
}else{
label.text = @"抢购剩余时间:";
int days = (int)(timeout/(3600*24));
if (days==0) {
dayLabel.text = @"";
}
int hours = (int)((timeout-days*24*3600)/3600);
int minute = (int)(timeout-days*24*3600-hours*3600)/60;
int second = timeout-days*24*3600-hours*3600-minute*60;
dispatch_async(dispatch_get_main_queue(), ^{
if (days==0) {
dayLabel.text = @"0天";
}else{
dayLabel.text = [NSString stringWithFormat:@"%d天",days];
}
if (hours<10) {
hourLabel.text = [NSString stringWithFormat:@"0%d :",hours];
}else{
hourLabel.text = [NSString stringWithFormat:@"%d :",hours];
}
if (minute<10) {
minLabel.text = [NSString stringWithFormat:@"0%d :",minute];
}else{
minLabel.text = [NSString stringWithFormat:@"%d :",minute];
}
if (second<10) {
secLabel.text = [NSString stringWithFormat:@"0%d",second];
}else{
secLabel.text = [NSString stringWithFormat:@"%d",second];
}
});
timeout--;
}
});
dispatch_resume(_timer);
}
iOS中倒计时的更多相关文章
- ios 中倒计时计算,时间戳为NaN
// 倒计时 daojishi(params) { let _this = this; let datetemp = this.servertimes; let lasttime = Date.par ...
- iOS中如何实现准确的倒计时程序 · 九十里
iOS中倒计时程序,考虑线程暂停场景. iOS App进入后台时,GCD线程也会跟着暂停.当程序进入前台后,GCD线程恢复.因而倒计时程序需要考虑这一点,通过加入时间的比对来实现. + (void)c ...
- ios 中的小技巧 - 总有你想要的 一
UITableView的Group样式下顶部空白处理 在viewWillAppear里面添加如下代码: //分组列表头部空白处理 CGRect frame = myTableView.tableHea ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- iOS中数据库应用基础
iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...
- 正则表达式在iOS中的运用
1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- iOS 中的 HotFix 方案总结详解
相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...
- iOS中使用正则
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- IOS中div contenteditable=true无法输入
在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...
随机推荐
- Android学习笔记之dispatchTouchEvent和OnInterceptTouchEvent和OnTouchEvent三个方法之间的联系...
PS:好久没有写博客了,项目正式开始启动了,但是怎么也打不起精神来...可能还是不适应放假留校...这下一年只能回家一次了...伤感...写篇博客舒坦下... 学习内容: Android中disp ...
- JS&CSS文件请求合并及压缩处理研究(二)
上篇交待了一些理论方面的东西,并给出了另外一种解决方案的处理流程.本篇将根据该处理流程,开始代码方面的编写工作. 1,打开VS,新建ASP.NET MVC Web项目,项目类型选择空.名称为 Mcmu ...
- [Test] 单元测试艺术(1) 基础知识
单元测试不是软件开发的新概念,在1970年就一直存在,屡屡被证明是最理想的方法之一. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,测试框架 创建优秀的单元测试 本节索引: 单 ...
- Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
导读 行文本输入框在用于界面的文本输入,在WEB登录表单中应用广泛.一般行文本编辑框可定制性较高,既可以当作密码输入框,又可以作为文本过滤器.QLineEdit本身使用方法也很简单,无需过多的设置就能 ...
- ok6410 android driver(3)
This article discusses the Makefile and how to port the module to different platform (localhost and ...
- 禁止苹果浏览器Safari将数字识别成电话号码的方法
偶然发现用ipad访问我的网站时,发现网站上的一串数字变颜色了(原来是红色的),现在变成了蓝色.一开始以为网站出了什么问题,后来在PC端查看,发现颜色依旧是红色.在ipad上点击还会弹出菜单呼叫的选项 ...
- 【iOS】线程安全的文件读写
前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多 ...
- 快捷获取浏览器(navigator对象)的全部属性
理论: navigator对象包含关于web浏览器的信息,浏览器的类型,版本信息都可以从该对象获取. 属性 说明 appCodeName 浏览器代码说明 appName 浏览器名称 appVe ...
- Android入门:Activity四种启动模式
一.启动模式介绍 启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置: 启动模式有4种,分别为standa ...
- Wijmo金融图表系列之平均K线图&砖形图
2015年7月16日将会发布有史以来最令人兴奋的控件-Wijmo 金融图表,它的一体化设计为单个自定义集合提供了所有主要的金融图表,这是市场上的其他控件都不具备的独一无二的好处.它像Wijmo其他任意 ...