swift SwfitUI列表禁用滚动

mgdq6dx1  于 2022-10-31  发布在  Swift
关注(0)|答案(8)|浏览(370)

有没有办法让SwiftUI中的列表不可滚动?
就像我们一样
tableView.isScrollEnabled

pokxtpni

pokxtpni1#

请使用ForEach,而不要使用可滚动的List
默认情况下,ForEach不可滚动。
下面是一个使用ForEach的示例

struct ContentView: View {
    let colors: [Color] = [.red, .green, .blue]

    var body: some View {
        VStack {
            ForEach(colors, id: \.self) { color in
                Text(color.description.capitalized)
                    .padding()
                    .background(color)
            }
        }
    }
}

ForEach的一个好资源可以在here中找到,类似地,List的一个好资源可以在here中找到。

更新

目前有两种方法可以阻止List滚动:

  • 使用UITableView.appearance().isScrollEnabled = false(但这可能会产生意外的副作用)
  • 使用第三方依赖项Introspect

警告

List包含在NavigationView

如果你的List包含在NavigationView中,那么它仍然会滚动。以上两种方法都不会阻止它滚动。
以下是一个示例视图:

import SwiftUI
import Introspect

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0..<10, id: \.self) { _ in
                    NavigationLink("Tap") {
                        Text("Hello").onTapGesture {
                            print("hello")
                        }
                    }
                }
            }
//            .onAppear {
//                UIScrollView.appearance().isScrollEnabled = false
//            }
//            .introspectTableView { tableView in
//                tableView.isScrollEnabled = false
//            }
        }
    }
}

取消注解onAppearintrospectTableView不会停止滚动List

List未包含在NavigationView

如果List不包含在NavigationView中,那么我们可以停止List的滚动。
如果我们从上面的例子中删除NavigationView,我们可以看到,通过取消注解onAppearintrospectTableViewList确实会停止滚动。
下面是一个video的上述情况。

t30tvxxf

t30tvxxf2#

这是我的扩展名,用于在列表上禁用滚动。

extension View {

    func hasScrollEnabled(_ value: Bool) -> some View {
        self.onAppear {
            UITableView.appearance().isScrollEnabled = value
        }
    }
}

示例:

List {
    ...
}
.hasScrollEnabled(false)

不要忘了打开隐藏到UITableView。外观()。isScrollEnabled = true

9w11ddsr

9w11ddsr3#

简化YannSteph的回答:

List {
    ...    
}
.onAppear {
    UITableView.appearance().isScrollEnabled = false
}
wooyq4lh

wooyq4lh4#

虽然使用VStack + ForEach可以达到一定的效果,但缺点之一是,当点击一行时,点击反馈不再是您对tableview的期望(背景不会突出显示),因此根据UX期望,它可能不是一个合适的解决方案。
另一种方法是使用此第三方库:
https://github.com/siteline/SwiftUI-Introspect
然后你就可以

List {
    // ...
}
.introspectTableView { tableView in
                         tableView.isScrollEnabled = false
                     }
siotufzp

siotufzp5#

如果您需要使用List(例如,用于选择),最适合我的方法(而不是禁用所有列表的滚动)是通过编程设置列表的高度:

List(items){ item in Text(item.title)}.frame(
  height: CGFloat(items.count) * CGFloat(ROW_HEIGHT)
)

这样,列表就不会滚动,因为它设置为显示所有项目所需的高度。

wz1wpwve

wz1wpwve6#

不禁用所有列表滚动的最佳方法是:

List{
 Text("Test")
}
.onAppear { UITableView.appearance().isScrollEnabled = false }
.onDisappear{ UITableView.appearance().isScrollEnabled = true }
pvcm50d1

pvcm50d17#

在iOS 16中,您可以通过添加.scrollDisabled(true)来实现这一点。

List {
    // ...
}
.scrollDisabled(true)
3qpi33ja

3qpi33ja8#

我敢肯定,这也禁用了内容,但你可以这样做:

List {
    // ...
}.disabled(true)

SwiftUI中非常缺乏ScrollView API,因此您可能希望使用UIViewRepresentable

相关问题