Swift UI 用 Timer 每秒更新 Text 时文字会出现残影

4 小时 27 分钟前
 appstore54321

想在 app 里加一个页面显示当前的系统时间,精确到秒,网上查到的资料都是推荐用 Timer 每秒触发一次更新。

struct AtomicClockView: View {
    @State private var currentDate = Date.now
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    var body: some View {
        Text(currentDate.formatted(date: .omitted, time: .standard))
            .font(.system(size: 50, weight: .ultraLight, design: .monospaced))
            .onReceive(timer) { input in
                currentDate = input
            }
    }
}

然后放在 TabView 里了

var body: some View {
        NavigationStack {
            TabView {
                AtomicClockView()
                    .tabItem {
                        Label("Atomic Clock", systemImage: "clock")
                    }
            }
        }
    }

在 Xcode 里预览和模拟器里看起来都一切正常,但是在手机( iPhone 14 Pro, iOS 18 )上打开之后,可以明显感到秒的文字在更新时会有上一秒的残影叠加在上面,而不是瞬间消失再渲染下一秒。而且好像是头几秒没有问题,第 3 秒左右开始出现残影。

搜索了一下好像没有人提过类似的问题,所以不知道是 SwiftUI 的问题还是代码的问题,每秒一次的频率应该不会是性能问题吧(尝试把 Timer 改成 0.1 也无法解决)。

感谢帮助。

137 次点击
所在节点    iDev
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1074636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX