向 iOS 应用程序添加正在运行的计数显示计时器,例如时钟秒表?
Posted
技术标签:
【中文标题】向 iOS 应用程序添加正在运行的计数显示计时器,例如时钟秒表?【英文标题】:Add a running countup display timer to an iOS app, like the Clock stopwatch? 【发布时间】:2012-08-18 01:41:34 【问题描述】:我正在使用一个应用程序来处理设备运动事件并以 5 秒为增量更新界面。我想向应用程序添加一个指示器,以显示应用程序运行的总时间。类似于秒表的计数器(如原生 ios 时钟应用)似乎是一种合理的方式来计算应用运行的时间并将其显示给用户。
我不确定这种秒表的技术实现。这是我的想法:
如果我知道界面更新之间的时间间隔,我可以将事件之间的秒数相加,并将秒数作为局部变量。或者,一个 0.5 秒间隔的预定计时器可以提供计数。
如果我知道应用程序的开始日期,我可以使用 [[NSDate dateWithTimeInterval:(NSTimeInterval) sinceDate:(NSDate *)]
将本地变量转换为每次接口更新的日期
我可以使用具有短时间样式的 NSDateFormatter 使用 stringFromDate
方法将更新的日期转换为字符串
可以将生成的字符串分配给界面中的标签。
结果是应用程序的每个“滴答”都会更新秒表。
在我看来,这个实现有点太重了,不像秒表应用那样流畅。是否有更好、更具交互性的方式来计算应用程序运行的时间?也许iOS已经为此提供了一些东西?
【问题讨论】:
定义“太重”、“不太流畅”和“更具交互性”。你想解决什么问题? “太重”是指该应用程序正在执行大量计算,并且我读过涉及日期格式化程序或日历的日期操作是“昂贵”的操作。我想减少秒表每次更新的日期计算开销 【参考方案1】:如果您在基本横幅项目中查看the iAd sample code from Apple,他们有一个简单的计时器:
NSTimer *_timer;
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
以及他们拥有的方法
- (void)timerTick:(NSTimer *)timer
// Timers are not guaranteed to tick at the nominal rate specified, so this isn't technically accurate.
// However, this is just an example to demonstrate how to stop some ongoing activity, so we can live with that inaccuracy.
_ticks += 0.1;
double seconds = fmod(_ticks, 60.0);
double minutes = fmod(trunc(_ticks / 60.0), 60.0);
double hours = trunc(_ticks / 3600.0);
self.timerLabel.text = [NSString stringWithFormat:@"%02.0f:%02.0f:%04.1f", hours, minutes, seconds];
它只是从启动开始运行,非常基本。
【讨论】:
我怎样才能将计数器重置为 00:00:00?【参考方案2】:几乎是@terry lewis 的建议,但经过算法调整:
1) 安排一个计时器
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
2)当计时器触发时,获取当前时间(这是调整,不要计算滴答声,因为如果计时器中有摆动,滴答声计数会累积错误),然后更新 UI。此外,NSDateFormatter 是一种更简单、更通用的格式化时间以进行显示的方法。
- (void)timerTick:(NSTimer *)timer
NSDate *now = [NSDate date];
static NSDateFormatter *dateFormatter;
if (!dateFormatter)
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"h:mm:ss a"; // very simple format "8:47:22 AM"
self.myTimerLabel.text = [dateFormatter stringFromDate:now];
【讨论】:
以上是关于向 iOS 应用程序添加正在运行的计数显示计时器,例如时钟秒表?的主要内容,如果未能解决你的问题,请参考以下文章