SwiftUI ScrollView 垂直和水平滚动

Posted

技术标签:

【中文标题】SwiftUI ScrollView 垂直和水平滚动【英文标题】:SwiftUI ScrollView vertical and horizontal scroll 【发布时间】:2020-09-23 20:22:53 【问题描述】:

我有一个滚动视图,我想根据 @State 更改滚动的方向。

struct HomeScreen: View 
    @State var isVertical: Boolean = true

    var body: some View 
    VStack
        Button(action: 
                self.isVertical.toggle()
            ) 
                Text("press me")
        .padding()
        ScrollView(self.isVertical == true ? .horizontal : .vertical, showsIndicators: true)
                    if(self.isVertical)
                        HStack 
                            Text("a")
                            Text("b")
                            Text("c")
                            Text("d")

                            Spacer()
                        
                     else 
                        VStack
                            Text("a")
                            Text("b")
                            Text("c")
                            Text("d")
                        
                    
                .padding()
    

当第一次在这个屏幕上滚动视图是垂直的时,只要我点击按钮并反转状态,滚动视图就会改变并变得疯狂,垂直和水平滚动。我究竟做错了什么?我希望基于您正在垂直或水平滚动的那个。非常感谢

【问题讨论】:

【参考方案1】:

这里是固定的变体(也更正了isVertical 的处理以符合含义)

使用 Xcode 11.4 / ios 13.4 测试

struct HomeScreen: View 
    @State var isVertical: Bool = true

    var body: some View 
        VStack
            Button(action: 
                    self.isVertical.toggle()
                ) 
                    Text("press me")
            .padding()
            ScrollView(self.isVertical ? .vertical : .horizontal, showsIndicators: true)
                        if(self.isVertical)
                            VStack 
                                Text("a")
                                Text("b")
                                Text("c")
                                Text("d")

                                Spacer()
                            
                         else 
                            HStack
                                Text("a")
                                Text("b")
                                Text("c")
                                Text("d")
                            
                        
                    .id(isVertical)       // << main part !!
                     .padding()
        
    

【讨论】:

以上是关于SwiftUI ScrollView 垂直和水平滚动的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI ScrollView 中停止垂直滚动

SwiftUI Drag 事件如何限制仅检测水平/垂直滚动

在 SwiftUi 中水平组合和打破垂直滚动视图?

SwiftUI:奇怪的行为 ScrollView

SwiftUI ScrollView 也触发 DragGesture

SwiftUI/UIKit:水平滚动视图缩放视图