SwiftUI启动时,缺少的功能之一就是能够以编程方式控制ScrollViews 的偏移量:
在Xcode 12和iOS 14中,我们已经获得了ScrollViewReader,它恰好解决了这一缺点。
另一个缺少的功能是可能添加sectionIndexTitles到Lists:这是放置在表视图尾部的索引列表(例如A通过Z),用于快速跳转到特定部分。
在本文中,我们将使用ScrollViewReader和 DragGesture贯彻我们自己SectionIndexTitles:
- 我们将使用和ScrollView一起使用ScrollViewReader(List本文末尾提供了一个示例)。
- 虽然我们使用了ScrollView,但是我们仍然希望延迟加载UI元素,因此我们也将使用LazyVstack。
- 最后,设备数据以字典的形式出现,其中键是节头,元素是节内容。
struct ContentView: View {
let devices: [String: [String]]
var body: some View {
ScrollView {
LazyVStack {
devicesList
}
}
.navigationBarTitle("Apple Devices")
}
var devicesList: some View {
ForEach(devices.sorted(by: { (lhs, rhs) -> Bool in
lhs.key < rhs.key
}), id: \.key) { categoryName, devicesArray in
Section(
header: HeaderView(title: categoryName)
) {
ForEach(devicesArray, id: \.self) { deviceName in
RowView(text: deviceName)
}
}
}
}
}
在这里,我还将介绍几个辅助视图RowView和HeaderView,以使代码更具可读性: