我想根据列表上的滚动为标题视图设置动画,但标题位于覆盖我列表的 zstack 中。 因此我用了一个
@State var offset: CGFloat
存储我的滚动偏移量并相应地更新我的标题视图,但这样做会导致 80% 的 cpu 使用率和滚动时严重的滞后
我尝试了所有可以想象的方法,但无法解决这个问题,从使用 EnviornmentObjects 到使用合并来限制更新
一般来说,更新 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")