在 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)时消失,为啥?

如何在 SwiftUI 中将表单滚动到特定的 UI 元素

SwiftUI 在列表滚动期间停止更新

列表不滚动(在 SwiftUI 中——为了消除其他问题的歧义)

SwiftUI:在横向列表中点击导航栏不会将列表滚动到顶部

禁用和启用页面滚动 (Swift)