20

我想创建一个 SwiftUI 列表,但不显示滚动指示器。ScrollView 提供了 showIndicators 来执行此操作。怎么做到呢?

4

4 回答 4

32

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

您可以摆脱显示所有Lists 的指标,但使用UITableView. 因为 SwiftUIListUITableView幕后用于 iOS:

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

请注意,这将消除所有TableViews 和Lists 指示符。如果需要,你应该让它再次可见。


⚠️ 尚不重要的注意事项

似乎苹果正在删除黑客(但还没有appearance针对这个)。因此,您可以使用inside 和而不是使用 available 参数来隐藏指标。LazyVStackScrollViewList

struct ContentView: View {
    var body: some View {
        ScrollView(.vertical, showsIndicators: false) { // <- This argument
            LazyVStack {
                ForEach(1...100, id: \.self) {
                    Text("\($0)").frame(height: 40)
                }
            }
        }
    }
}
于 2019-10-10T21:40:36.233 回答
14

实际上很容易做到这一点,而无需在接受的答案中进行任何外观变通。您只需使用 ScrollView 初始化程序并将参数设置showsIndicators为 false。

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

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

于 2020-10-16T22:13:50.430 回答
1

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

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

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

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

于 2021-10-18T11:29:43.653 回答
1

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

您“可能”能够创建一个 UIViewRepresentable ,它可以向上遍历视图层次结构,直到找到滚动视图,但我不推荐它。

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

于 2019-10-10T21:20:23.313 回答