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

ret*_*pok 15 swiftui swiftui-list

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

Moj*_*ini 28

您可以摆脱为所有Lists显示指示器,但使用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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


?? 尚未重要的注意事项

好像苹果去除appearance黑客(但不是这一个尚未)。因此,您可以使用LazyVStackinside 和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)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 可能并不适合所有人,因为从 iOS 15 开始,List 具有可刷新修饰符。 (3认同)

Luk*_*ker 12

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

ScrollView(.vertical, showsIndicators: false) {
     // ... your content for scrollView
}
Run Code Online (Sandbox Code Playgroud)

在您的 ScrollView 中,您可以使用LazyVStack,如果您在这里有很多子视图并希望让 SwiftUI 高效渲染(按需)。

  • @FarouK,问题是“如何隐藏指示器?”,问题不是“LazyVStack 什么时候会成为比 ScrollView 更好的解决方案?”,所以你的评论在这里似乎有点错位。 (3认同)
  • 但是您的解决方案对性能有很大的副作用,而您没有提到这一点。 (3认同)
  • ScrollView 对性能不利,因为它的所有视图都是立即创建的,而不是像 LazyVStack 的 List 那样在需要时创建。 (2认同)
  • @FarouK:嗯,这些问题本身就是问题。提问者已经决定使用 ScrollView(但没有指示器)。顺便说一句,除非您有超过 20 个子视图,否则不会出现性能问题。所以你的评论似乎有点聪明。 (2认同)

小智 11

隐藏滚动指示器现在变得非常简单

   List {}.scrollIndicators(ScrollIndicatorVisibility.hidden)
Run Code Online (Sandbox Code Playgroud)

  • 您应该提及此功能何时可用:“scrollIndicators(_:axes:)”仅在 iOS 16.0 或更高版本中可用 (3认同)

Răz*_*oiu 9

所选择的答案在 iOS 16 中不起作用。他们发布了一个viewModifier名为.scrollIndicators(.hidden). 我创建了一个 viewModifier 包装器,您可以在您的List.modifier(HideListIndicatorsViewModifier())

struct HideListIndicatorsViewModifier: ViewModifier {
    
    @ViewBuilder
    func body(content: Content) -> some View {
        if #available(iOS 16.0, *) {
            content
                .scrollIndicators(.hidden)
        } else {
            content
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


The*_*eoK 6

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

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

List {
  ...
}
.introspectTableView { tableView in
  tableView.showsVerticalScrollIndicator = false // here you can access any other UITableView property
}
Run Code Online (Sandbox Code Playgroud)

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