重复更新 @State 或 @Published 值时 CPU 使用率高 - 在 swiftui 中频繁

问题描述 投票:0回答:1

我想根据列表上的滚动为标题视图设置动画,但标题位于覆盖我列表的 zstack 中。 因此我用了一个

@State var offset: CGFloat
存储我的滚动偏移量并相应地更新我的标题视图,但这样做会导致 80% 的 cpu 使用率和滚动时严重的滞后

我尝试了所有可以想象的方法,但无法解决这个问题,从使用 EnviornmentObjects 到使用合并来限制更新

swift swiftui scroll state lag
1个回答
0
投票

一般来说,更新 Observables 和监听 swiftui 中的变化会花费很多成本,不应该用于频繁更新的值,例如滚动偏移量。 通过将标题作为列表中的第一项并将其偏移量等于滚动偏移量的负值,我能够获得所需的动画。 这样滚动偏移量不会保存在

@State
中,因此解决了CPU使用问题

GeometryReader { geometry in
    let minY = geometry.frame(in: .named("SCROLL")).minY
    VStack {
         HeaderView(
                offset: minY
            )
            .zIndex(10)
            .offset(y: -minY)

         //rest of the scroll view
    }
}

您的滚动视图不需要位于同一个文件或几何读取器中,只需将相同的

CoordinatorSpace
应用于它

ScrollView {
    //scroll content which also includes the HeaderView
}
.coordinateSpace(name: "SCROLL")
© www.soinside.com 2019 - 2024. All rights reserved.