有没有办法让SwiftUI中的列表不可滚动?就像我们一样tableView.isScrollEnabled
pokxtpni1#
请使用ForEach,而不要使用可滚动的List。默认情况下,ForEach不可滚动。下面是一个使用ForEach的示例
ForEach
List
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
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 // } } } }
取消注解onAppear或introspectTableView不会停止滚动List。
onAppear
introspectTableView
如果List不包含在NavigationView中,那么我们可以停止List的滚动。如果我们从上面的例子中删除NavigationView,我们可以看到,通过取消注解onAppear或introspectTableView,List确实会停止滚动。下面是一个video的上述情况。
t30tvxxf2#
这是我的扩展名,用于在列表上禁用滚动。
extension View { func hasScrollEnabled(_ value: Bool) -> some View { self.onAppear { UITableView.appearance().isScrollEnabled = value } } }
示例:
List { ... } .hasScrollEnabled(false)
不要忘了打开隐藏到UITableView。外观()。isScrollEnabled = true
9w11ddsr3#
简化YannSteph的回答:
List { ... } .onAppear { UITableView.appearance().isScrollEnabled = false }
wooyq4lh4#
虽然使用VStack + ForEach可以达到一定的效果,但缺点之一是,当点击一行时,点击反馈不再是您对tableview的期望(背景不会突出显示),因此根据UX期望,它可能不是一个合适的解决方案。另一种方法是使用此第三方库:https://github.com/siteline/SwiftUI-Introspect然后你就可以
List { // ... } .introspectTableView { tableView in tableView.isScrollEnabled = false }
siotufzp5#
如果您需要使用List(例如,用于选择),最适合我的方法(而不是禁用所有列表的滚动)是通过编程设置列表的高度:
List(items){ item in Text(item.title)}.frame( height: CGFloat(items.count) * CGFloat(ROW_HEIGHT) )
这样,列表就不会滚动,因为它设置为显示所有项目所需的高度。
wz1wpwve6#
不禁用所有列表滚动的最佳方法是:
List{ Text("Test") } .onAppear { UITableView.appearance().isScrollEnabled = false } .onDisappear{ UITableView.appearance().isScrollEnabled = true }
pvcm50d17#
在iOS 16中,您可以通过添加.scrollDisabled(true)来实现这一点。
.scrollDisabled(true)
List { // ... } .scrollDisabled(true)
3qpi33ja8#
我敢肯定,这也禁用了内容,但你可以这样做:
List { // ... }.disabled(true)
SwiftUI中非常缺乏ScrollView API,因此您可能希望使用UIViewRepresentable。
UIViewRepresentable
8条答案
按热度按时间pokxtpni1#
请使用
ForEach
,而不要使用可滚动的List
。默认情况下,
ForEach
不可滚动。下面是一个使用
ForEach
的示例ForEach
的一个好资源可以在here中找到,类似地,List
的一个好资源可以在here中找到。更新
目前有两种方法可以阻止
List
滚动:UITableView.appearance().isScrollEnabled = false
(但这可能会产生意外的副作用)警告
List
包含在NavigationView
中如果你的
List
包含在NavigationView
中,那么它仍然会滚动。以上两种方法都不会阻止它滚动。以下是一个示例视图:
取消注解
onAppear
或introspectTableView
不会停止滚动List
。List
未包含在NavigationView
中如果
List
不包含在NavigationView
中,那么我们可以停止List
的滚动。如果我们从上面的例子中删除
NavigationView
,我们可以看到,通过取消注解onAppear
或introspectTableView
,List
确实会停止滚动。下面是一个video的上述情况。
t30tvxxf2#
这是我的扩展名,用于在列表上禁用滚动。
示例:
不要忘了打开隐藏到UITableView。外观()。isScrollEnabled = true
9w11ddsr3#
简化YannSteph的回答:
wooyq4lh4#
虽然使用VStack + ForEach可以达到一定的效果,但缺点之一是,当点击一行时,点击反馈不再是您对tableview的期望(背景不会突出显示),因此根据UX期望,它可能不是一个合适的解决方案。
另一种方法是使用此第三方库:
https://github.com/siteline/SwiftUI-Introspect
然后你就可以
siotufzp5#
如果您需要使用
List
(例如,用于选择),最适合我的方法(而不是禁用所有列表的滚动)是通过编程设置列表的高度:这样,列表就不会滚动,因为它设置为显示所有项目所需的高度。
wz1wpwve6#
不禁用所有列表滚动的最佳方法是:
pvcm50d17#
在iOS 16中,您可以通过添加
.scrollDisabled(true)
来实现这一点。3qpi33ja8#
我敢肯定,这也禁用了内容,但你可以这样做:
SwiftUI中非常缺乏ScrollView API,因此您可能希望使用
UIViewRepresentable
。