我有一個倒數計時器到一個特定的日期。它看起來不錯,每秒更新一次以顯示倒計時。下面是我用來創建計時器代碼:創建一個計時器,每秒鐘運行一次?
func scheduleTimeLabelsUpdateTimer() {
var components = Calendar.current.dateComponents([.day, .hour, .minute, .second], from: Date())
components.second! += 1
let nextSecondDate = Calendar.current.date(from: components)!
let timer = Timer(fireAt: nextSecondDate, interval: 1, target: self, selector: #selector(updateTimeLabels), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: .commonModes)
}
不過,我想它在第二更新每一秒,,使在同一時間每個第二時鐘更新經過。現在,它會在調用此方法時每秒更新一次,這在viewDidLoad()
中。
例如,如果倒計時設置爲午夜,我希望它恰好在午夜時點到零。現在它可能會在午夜後略微達到零,這取決於用戶打開此屏幕時的時間差。
編輯:這是如何倒計時顯示給用戶。 updateTimeLabels()
只是根據在該日期之前剩餘的時間量設置每個標籤的文本。我希望每一個標籤都能在每一秒完全更新。這樣倒計時將準確地按時「打零」。注意現在如何,秒數達到零,然後狀態欄上的系統時鐘更新。我希望這些發生在同一時間。
此代碼,這是我幾個月前發現某處的堆棧溢出,被稱爲updateTimeLabels()
來計算剩餘時間:
public func timeOffset(from date: Date) -> (days: Int, hours: Int, minutes: Int, seconds: Int) {
// Number of seconds between times
var delta = Double(self.seconds(from: date))
// Calculate and subtract whole days
let days = floor(delta/86400)
delta -= days * 86400
// Caluclate and subtract whole hours
let hours = floor(delta/3600).truncatingRemainder(dividingBy: 24)
delta -= hours * 3600
// Calculate and subtract whole minutes
let minutes = floor(delta/60.0).truncatingRemainder(dividingBy: 60)
delta -= minutes * 60
// What's left is seconds
let seconds = delta.truncatingRemainder(dividingBy: 60)
return (Int(days), Int(hours), Int(minutes), Int(seconds))
}
你是什麼意思命中零? –
倒數計時器顯示特定日期之前的天數,小時數,分鐘數和秒數。如果日期設定爲今晚午夜,那麼我希望所有這些標籤在今晚變成午夜時都準確地說出「0」,而不是一秒鐘之後的一部分。 – CompC
它現在的行爲如何? –