在 SwiftUI 中使用 List 时,有没有办法只检测屏幕上显示的单元格?

Is there a way to detect only the cells displayed on the screen when using List in SwiftUI?

是否可以从如下所示的100个项目中检测当前显示在View屏幕上的List的单元格(或数组位置)?

另外,当时想详细的获取cell的位置,比如有些cell在屏幕的顶部和底部半遮半掩

struct DemoList: View {
    // 1.
    @State private var items: [Item] = (0..<100).map { Item(title: "Item #\([=10=])") }

    // 2.
    var body: some View {
        List {
            ForEach(items) { item in
                Text(item.title)
            }
        }
    }
}

尝试使用“onAppear”修饰符作为 Text(text).onAppear {} 自 iOS 15 以来,围绕该修饰符进行了改进

这可能是一个起点。但要注意 List 在 .onAppear/.onDisappear 开始之前总是保留一个“缓冲”单元格。

        List {
            ForEach(items) { item in
                GeometryReader { geo in
                    Text(item.title)
                        .onAppear {
                            print(item.title, geo.frame(in: .global))
                        }
                        .onDisappear {
                            print(item.title, "---")
                        }
                }
            }
        }

更复杂的方法是使用 PreferenceKey。我推荐这个(寻找“GridInfoPreference”):https://swiftui-lab.com/impossible-grids/