我想创建一个 SwiftUI 列表,但不显示滚动指示器。ScrollView 提供了 showIndicators 来执行此操作。怎么做到呢?
4 回答
任何指标(列表、滚动视图等)
您可以摆脱显示所有List
s 的指标,但使用UITableView
. 因为 SwiftUIList
在UITableView
幕后用于 iOS:
struct ContentView: View {
init() {
UITableView.appearance().showsVerticalScrollIndicator = false
}
var body: some View {
List(0...100, id: \.self) { item in
Text("hey")
}
}
}
请注意,这将消除所有TableView
s 和List
s 指示符。如果需要,你应该让它再次可见。
⚠️ 尚不重要的注意事项
似乎苹果正在删除黑客(但还没有appearance
针对这个)。因此,您可以使用inside 和而不是使用 available 参数来隐藏指标。LazyVStack
ScrollView
List
struct ContentView: View {
var body: some View {
ScrollView(.vertical, showsIndicators: false) { // <- This argument
LazyVStack {
ForEach(1...100, id: \.self) {
Text("\($0)").frame(height: 40)
}
}
}
}
}
实际上很容易做到这一点,而无需在接受的答案中进行任何外观变通。您只需使用 ScrollView 初始化程序并将参数设置showsIndicators
为 false。
ScrollView(.vertical, showsIndicators: false) {
// ... your content for scrollView
}
LazyVStack
如果您有很多子视图要滚动浏览,您可以在 ScrollView 中使用。然后 SwiftUI 将非常有效地呈现您的子视图:“懒惰” -> 仅在需要时)。
在有一个原生的 SwiftUI 方法来实现这一点之前,Introspect库提供了一个不错的解决方案。
将所有修饰符应用于您的列表后,只需将以下修饰符添加为最后一个修饰符:
List {
...
}
.introspectTableView { tableView in
tableView.showsVerticalScrollIndicator = false // here you can access any other UITableView property
}
我希望在某个时候有一种本地方法可以做到这一点。
List 基本上在幕后创建了一个 tableview (UpdateCoalescingTableView),并且 tableview 是可滚动的。然而,不幸的是,您无法访问 SwiftUI 中的滚动视图属性。
您“可能”能够创建一个 UIViewRepresentable ,它可以向上遍历视图层次结构,直到找到滚动视图,但我不推荐它。
您还可以创建自己的滚动视图,在其中放置一个 vstack,然后“伪造”一个列表视图,这可能是更安全的方法。