【发布时间】:2020-07-27 15:23:57
【问题描述】:
我正在尝试为我的应用程序设置时钟(实际时间)/计时器(倒计时)。我知道我的解决方案有点粗糙,但一切正常,但是。当我暂停倒计时然后重新开始时 - 第一次计数器添加时间(大约一秒钟),因为我按下暂停按钮,然后加载我保存的 timeCounter 值并继续倒计时.. 为什么?另外,如果您有更好的更流畅的解决方案,我会非常高兴.. 谢谢!
import SwiftUI
struct Clock : View {
@State private var nowDate: Date = Date()
@State private var referenceDate: Date = Date()
@State private var display: Bool = true
@State private var updateTimer: Timer?
@State private var timeCounter: Double = 0
@State private var timerRunning: Bool = false
var body: some View {
VStack {
Button(action: {
self.display.toggle()
}) {
Text(display ? "COUNTDOWN" : "TIME")
}
Text(display ? "\(timeString(date: nowDate))" : "\(countDownString(for: referenceDate))")
HStack {
Button(action: {
self.display = false
self.timeCounter = 10
self.referenceDate = Date(timeIntervalSinceNow: self.timeCounter)
}) {
Text("10")
}
}
Button(action: {
if self.timerRunning {
self.referenceDate = Date(timeIntervalSinceNow: self.timeCounter)
self.startTimer()
self.timerRunning.toggle()
} else {
self.updateTimer?.invalidate()
self.timerRunning.toggle()
}
}) {
Text(timerRunning ? "START" : "PAUSE")
}
}
.onAppear {
self.startTimer()
}
}
//MARK: Timer
func startTimer() {
self.updateTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
self.nowDate = Date()
if self.referenceDate.distance(to: self.nowDate) >= 0 {
self.referenceDate = Date(timeIntervalSinceNow: 0)
self.display = true
}
self.timeCounter -= 1
}
}
//MARK: - CountDown Timer
func countDownString(for date: Date) -> String {
let calendar = Calendar(identifier: .gregorian)
let components = calendar
.dateComponents([.hour, .minute, .second],
from: nowDate,
to: referenceDate)
return String(format: "%02d:%02d:%02d",
components.hour ?? 00,
components.minute ?? 00,
components.second ?? 00)
}
//MARK: - Clock Timer
var timeFormat: DateFormatter {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
return formatter
}
func timeString(date: Date) -> String {
let time = timeFormat.string(from: date)
return time
}
}
【问题讨论】:
标签: timer swiftui countdown clock