在 SwiftUI 列表/表单中禁用滚动
Posted
技术标签:
【中文标题】在 SwiftUI 列表/表单中禁用滚动【英文标题】:Disable Scrolling in SwiftUI List/Form 【发布时间】:2020-03-28 19:09:39 【问题描述】:最近,我一直致力于创建一个复杂的视图,它允许我在表单下方使用选取器。在每种情况下,表单都只有两个选项,因此没有足够的数据向下滚动以获取更多数据。能够滚动这个表单但不能滚动下面的 Picker 会让视图感觉很糟糕。我不能将选取器放在表单内,否则 SwiftUI 会更改选取器上的样式。而且我在任何地方都找不到是否可以在不使用的情况下禁用列表/表单上的滚动:
.disable(condition)
有没有办法在不使用上述语句的情况下禁用列表或表单的滚动? 这是我的参考代码
VStack
Form
Section
Toggle(isOn: $uNotifs.notificationsEnabled)
Text("Notifications")
if(uNotifs.notificationsEnabled)
Section
Toggle(isOn: $uNotifs.smartNotifications)
Text("Enable Smart Notifications")
.animation(.easeInOut)
// End Form
.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)
if(!uNotifs.smartNotifications)
GeometryReadergeometry in
HStack
Picker("",selection: self.$hours)
ForEach(0..<24)
Text("\($0)").tag($0)
.pickerStyle(WheelPickerStyle())
.frame(width:geometry.size.width / CGFloat(5))
.clipped()
Text("hours")
Picker("",selection: self.$min)
ForEach(0..<61)
Text("\($0)").tag($0)
.pickerStyle(WheelPickerStyle())
.frame(width:geometry.size.width / CGFloat(5))
.clipped()
Text("min")
【问题讨论】:
【参考方案1】:在这里
使用我的帖子SwiftUI: How to scroll List programmatically [solution]?中的方法,可以添加以下扩展名
extension ListScrollingProxy
func disableScrolling(_ flag: Bool)
scrollView?.isScrollEnabled = !flag
并在上面的演示中使用它
struct DemoDisablingScrolling: View
private let scrollingProxy = ListScrollingProxy()
@State var scrollingDisabled = false
var body: some View
VStack
Button("Scrolling \(scrollingDisabled ? "Off" : "On")")
self.scrollingDisabled.toggle()
self.scrollingProxy.disableScrolling(self.scrollingDisabled)
Divider()
List(0..<50, id: \.self) i in
Text("Item \(i)")
.background(ListScrollingHelper(proxy: self.scrollingProxy))
【讨论】:
我已经尝试过您的表单代码。但它没有任何效果。这个解决方案是否也适用于 SwiftUI/Form?以上是关于在 SwiftUI 列表/表单中禁用滚动的主要内容,如果未能解决你的问题,请参考以下文章
滚动视图中的内容作为列表项在滚动(swiftui)时消失,为啥?