在SwiftUI中禁用列表/表单的滚动

5

最近,我一直在尝试创建一个复杂的视图,使我可以在表单下方使用 Picker。在每种情况下,表单只有两个选项,因此没有足够的数据向下滚动以获取更多数据。能够滚动这个表单但不滚动下面的 Picker 会让视图感觉糟糕。我无法将Picker放置在表单内,否则SwiftUI会改变Picker的样式。我找不到任何地方可以禁用列表/表单上的滚动而不使用:

.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){
                GeometryReader{geometry 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")
                    }
2个回答

5
这里是:
使用我在我的回答中提到的方法,可以添加以下扩展来以编程方式滚动列表。

演示

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))
            }
        }

    }
}

1
我尝试了您的表单代码,但没有任何效果。这个解决方案对SwiftUI / Form也适用吗? - Kenan Nur

3
您可以在组件(表单或列表)上使用.scrollDisabled(true)修饰符来实现此行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接