有没有办法在 SwiftUI 列表中隐藏滚动指示器?

Is there a way to hide scroll indicators in a SwiftUI List?

我想创建一个 SwiftUI 列表,但不显示滚动指示器。 ScrollView 提供了 showIndicators 来做到这一点。怎么做到的?

List 基本上在幕后创建一个表视图 (UpdateCoalescingTableView),并且表视图是可滚动的。然而不幸的是,您无法在 SwiftUI 中访问滚动视图属性。

您 "might" 能够创建一个 UIViewRepresentable,它可以在视图层次结构中向上移动,直到找到滚动视图,但我不推荐它。

您也可以创建自己的滚动视图,在其中放置一个 vstack,然后 "fake" 一个列表视图,这可能是更安全的方法。

任何指标(列表、滚动视图等)

您可以取消显示所有 List 的指示器,但使用 UITableView 的 API。因为 SwiftUI List 在幕后将 UITableView 用于 iOS:

struct ContentView: View {
    
    init() {
        UITableView.appearance().showsVerticalScrollIndicator = false
    }
    
    var body: some View {
        List(0...100, id: \.self) { item  in
            Text("hey")
        }
    }
}

请注意,这将消除所有 TableViewList 指标。如果需要,您应该使其再次可见。


⚠️还没有重要提示

Apple 似乎正在移除 appearance 黑客攻击(但 目前还没有)。因此,您可以在内部使用 LazyVStackScrollView 而不是 List 并使用可用参数隐藏指标。

struct ContentView: View {
    var body: some View {
        ScrollView(.vertical, showsIndicators: false) { // <- This argument
            LazyVStack {
                ForEach(1...100, id: \.self) {
                    Text("\([=11=])").frame(height: 40)
                }
            }
        }
    }
}

在接受的答案中没有任何外观上的变通方法,实际上很容易做到这一点。您只需使用 ScrollView 初始值设定项并将参数 showsIndicators 设置为 false。

ScrollView(.vertical, showsIndicators: false) {
     // ... your content for scrollView
}

在您的 ScrollView 中,您可以使用 LazyVStack,如果您有很多子视图需要滚动浏览。 SwiftUI 然后将非常有效地呈现您的子视图:"lazy" -> 仅在需要时)。

在有原生 SwiftUI 方法实现此功能之前,Introspect 库提供了一个不错的解决方案。

将所有修饰符应用到您的列表后,只需将以下内容添加为最后一个修饰符:

List {
  ...
}
.introspectTableView { tableView in
  tableView.showsVerticalScrollIndicator = false // here you can access any other UITableView property
}

我希望在某个时候有一种本机方法可以做到这一点。

swift scrollview 隐藏滚动条

scrollView.showsHorizontalScrollIndicator = false 
scrollView.showsVerticalScrollIndicator = false

隐藏滚动视图指示器栏swiftui

ScrollView(.vertical, showsIndicators: false) {
     // ... your content for scrollView
}