我正在Swift制作一个应用程序,它有一个倒数计时器,必须在5个标签上显示分钟和秒数,确切地说,这就是阵型:
[9] [9] [9]:[5] [9]
// 999:59
所以,根据汽车旧里程表用于计算里程数的原则,或其中一个旧的翻转时钟数。
我将使用标签作为测试模型,稍后它们将被图像集替换,但我需要数字显示的逻辑。
我设法使用NSTimer.scheduledTimerWithTimeInterval(1.0...)
和一个单独的函数进行简单的倒计时,其中我从写入或声明的总数中减去一个数字。即
var initialTime:Int = 60
var timerSeconds = NSTimer()
func timerTick() {
timerSeconds = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "startCount", userInfo: nil, repeats: true)
}
func startCount() {
initialTime--
}
显示总时间没有问题,但要将总时间分为几分钟和几秒,并将这两个分为3个标签分钟和2秒......我已经尝试了几个小时我可以什么都想不到。如果我错过了一些东西,我相对较新,如此宽容。谢谢!
答案 0 :(得分:2)
这不是特定于Swift的。正确使用计时器是一个基础课程问题。
计算不同的数字是基本的计算机数学。
每次计时器开火时都不要递减计数器。计时器有时会错过" (如果你的应用程序忙碌,则无法调用)
相反,在启动计时器时记录NSDate.timeIntervalSinceReferenceDate() + secondsToCompletion
。
let finishedInterval =
NSDate.timeIntervalSinceReferenceDate() + secondsToCompletion
然后每次计时器触发时,计算新的剩余秒数并将其用于数学运算:
let remainingSeconds = Int(round(finishedInterval -
NSDate.timeIntervalSinceReferenceDate()))
//Then do math on the time to get your digits:
let secondsOnesPlace = remainingSeconds % 10
let secondsTensPlace = (remainingSeconds % 60) / 10
let remainingMinutes = remainingSeconds / 60
let remainingMinutesOncePlace = remainingMinutes % 10
let remainingMinutesTensPlace = (remainingMinutes / 10) % 10
let remainingMinutesHundredsPlace = (remainingMinutes / 100) % 10
println("\(remainingMinutesHundredsPlace)\(remainingMinutesTensPlace)\(remainingMinutesOncePlace):\(secondsTensPlace)\(secondsOnesPlace)")
然后使用所有" ...地点"用于设置标签数字/图像的值。
答案 1 :(得分:0)
我会建议使用CADisplayLink
和1fps,而不是计时器,而不是任何计时器。
将时间解析为5个标签(跳过点):
let time = 87.6543
let timeString = String(format: "%06.2f", time % 1000)
// 087.65
for (index, char) in enumerate(timeString) {
switch index {
case 0:
let label1 = char
case 1:
let label2 = char
case 2:
let label3 = char
case 4:
let label4 = char
case 5:
let label5 = char
default:
break
}
}
也许不是最优雅的解决方案,但可行。