小编Kla*_*usM的帖子

SwiftUI ScrollView:查找当前在屏幕中心可见的子视图。子视图在 ScrollView 中的位置。偏好键。滚动视图代理

挑战:我想跟踪 ScrollView 的哪个子视图位于该 ScrollView 可见区域的中间。

问题:据我了解,没有原生 SwiftUI 方法可以确定 ScrollView 的子视图当前在屏幕上是否可见。或者我想念这里的什么吗?

我的解决方案:我使用 PreferenceKey 来收集子视图位置,并在 ScrollView 滚动时连续发生的 PreferenceChange 上执行操作:检查最接近屏幕中心的视图。

问题:基于 PreferenceKey 的解决方案适用于一些子视图。但我需要跟踪最多 3000 个子视图(从数据库构建的大型结构化文档的视图)。即使在实施了我能够提出的一些优化之后,大量视图的性能也是不可接受的。

我的问题是:有吗

  • 提高下面所示解决方案性能的方法,或者
  • 应对这一挑战的不同方式

(iOS 14.4 / Xcode 12.4)

SwiftUI 跟踪屏幕中心的子视图

private struct ViewOffsetsKey: PreferenceKey {
    static var defaultValue: [Int: CGFloat] = [:]
    static func reduce(value: inout [Int: CGFloat], nextValue: () -> [Int: CGFloat]) {
        value.merge(nextValue(), uniquingKeysWith: { $1 })
    }
}

struct ContentView: View {
    @State private var offsets: [Int: CGFloat] = [:]
    @State private var …
Run Code Online (Sandbox Code Playgroud)

position scrollview ios swiftui geometryreader

5
推荐指数
1
解决办法
2263
查看次数

标签 统计

geometryreader ×1

ios ×1

position ×1

scrollview ×1

swiftui ×1