在Swift

时间:2015-08-17 14:04:35

标签: ios swift nstimer

我正在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秒......我已经尝试了几个小时我可以什么都想不到。如果我错过了一些东西,我相对较新,如此宽容。谢谢!

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
    }
}

也许不是最优雅的解决方案,但可行。