使用 Timer - SwiftUI 用一种颜色填充整个屏幕
Fill entire screen with a color using Timer - SwiftUI
我正在尝试使用计时器并用颜色填充屏幕。简单地说:我用 \ (UIScreen.main.bounds.height) 得到屏幕高度,并将它除以 selectedTime,比方说 \ (120) 秒。问题出现在这里:屏幕填满 232,而不是 844.0 屏幕大小,它在 32 秒而不是 120 秒内填满。我可能遗漏了什么。相关代码段:
.onChange(of: secondsToMinutesAndSeconds(seconds: timerManager.secondsLeft), perform: { waveTime in
let selectedCircularValue = availableMinutes[self.selectedCircularIndex] * 60
let heightProgress = CGFloat(UIScreen.main.bounds.height / CGFloat(selectedCircularValue))
if timerManager.screenHeightChanged < UIScreen.main.bounds.height {
timerManager.screenHeightChanged += CGFloat(heightProgress)
withAnimation(.linear) {
self.colorSize = CGFloat(Double(timerManager.screenHeightChanged))
}
} else {
timerManager.screenHeightChanged = 0
}
})
进度输出
{ seconds 120
screenHeight 844.0
estimatedTime screen / seconds -> (7.033333333333333)
...
progress 14.066666666666666
...
progress 225.06666666666663
...
progress 232.09999999999997
}
最后,动画能流畅吗?
Mine
My expectation
根据我的经验,UIScreen 可能会很烦人。尝试改用 GeometryReader,它在处理 SwiftUI 视图时效果更好。像这样包装视图
GeometryReader { geo in
SomeView()
}
.frame(width: .infinity, height: .infinity) //may not need this
然后,只要你想要视图的大小,只需使用 geo.size.width
或 geo.size.height
对于动画,请将 withAnimation
函数与 .animation(.linear)
等修饰符结合使用。
由于您没有分享最小的可重现示例,我无法分享完整的解决方案或针对您的案例测试我的解决方案。
我正在尝试使用计时器并用颜色填充屏幕。简单地说:我用 \ (UIScreen.main.bounds.height) 得到屏幕高度,并将它除以 selectedTime,比方说 \ (120) 秒。问题出现在这里:屏幕填满 232,而不是 844.0 屏幕大小,它在 32 秒而不是 120 秒内填满。我可能遗漏了什么。相关代码段:
.onChange(of: secondsToMinutesAndSeconds(seconds: timerManager.secondsLeft), perform: { waveTime in
let selectedCircularValue = availableMinutes[self.selectedCircularIndex] * 60
let heightProgress = CGFloat(UIScreen.main.bounds.height / CGFloat(selectedCircularValue))
if timerManager.screenHeightChanged < UIScreen.main.bounds.height {
timerManager.screenHeightChanged += CGFloat(heightProgress)
withAnimation(.linear) {
self.colorSize = CGFloat(Double(timerManager.screenHeightChanged))
}
} else {
timerManager.screenHeightChanged = 0
}
})
进度输出
{ seconds 120
screenHeight 844.0
estimatedTime screen / seconds -> (7.033333333333333)
...
progress 14.066666666666666
...
progress 225.06666666666663
...
progress 232.09999999999997
}
最后,动画能流畅吗?
Mine
My expectation
根据我的经验,UIScreen 可能会很烦人。尝试改用 GeometryReader,它在处理 SwiftUI 视图时效果更好。像这样包装视图
GeometryReader { geo in
SomeView()
}
.frame(width: .infinity, height: .infinity) //may not need this
然后,只要你想要视图的大小,只需使用 geo.size.width
或 geo.size.height
对于动画,请将 withAnimation
函数与 .animation(.linear)
等修饰符结合使用。
由于您没有分享最小的可重现示例,我无法分享完整的解决方案或针对您的案例测试我的解决方案。