我想显示一个倒计时计时器,它将采用当前的小时,分钟,秒,然后倒计时到00:00:00。我现在显示的是当前日期,但它还在增加.
我的期望:它会倒计时,当它回到00:00:00时,它会停止。
下面是我所有的代码
struct TimerView: View {
@State var timeRemaining = 24*60*60
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
var body: some View {
HStack(spacing: 12) {
timerStringView(timer: "\(hourString(timer: timeRemaining))")
timerStringView(timer: "\(minutesString(timer: timeRemaining))")
timerStringView(timer: "\(secondsString(timer: timeRemaining))")
}
.frame(width: 300, height: 34)
.background(Color.gray)
.onReceive(timer) { _ in
if timeRemaining > 0 {
timeRemaining -= 1
} else {
timer.upstream.connect().cancel()
}
}
}
func timerStringView(timer: String) -> some View {
Text(timer)
.font(.system(size: 18, weight: .bold))
.foregroundColor(.black)
.background(Color.white)
.cornerRadius(6)
}
func hourString(timer: Int) -> String {
let date = Date()
let calendar = Calendar.current
let hours = calendar.component(.hour, from: date)
return String(format: "%02i", hours)
}
func minutesString(timer: Int) -> String {
let date = Date()
let calendar = Calendar.current
let minutes = calendar.component(.minute, from: date)
return String(format: "%02i", minutes)
}
func secondsString(timer: Int) -> String {
let date = Date()
let calendar = Calendar.current
let second = calendar.component(.second, from: date)
return String(format: "%02i", second)
}
}
1条答案
按热度按时间9lowa7mx1#
使用on appear将小时、分钟和秒全部加起来以设置@State。注意:把小时数乘以3600是错误的,所以我使用了一个额外的变量来修复我的机器上。