使用 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.widthgeo.size.height

对于动画,请将 withAnimation 函数与 .animation(.linear) 等修饰符结合使用。

由于您没有分享最小的可重现示例,我无法分享完整的解决方案或针对您的案例测试我的解决方案。