在 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/
是否可以从如下所示的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/