微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scrollview 不会以偏移量滚动过去的视图

如何解决Scrollview 不会以偏移量滚动过去的视图

为了解决一个更复杂的问题,我创建了以下简单的测试项目:

struct ContentView: View {
    var body: some View {
        ScrollView {
            ZStack {
                ForEach(0..<50) { index in
                    Text("Test \(index)")
                        .offset(x: 0,y: CGFloat(index * 20))
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这会在 ZStack 内绘制 50 个 Text 视图,每个视图都有较大的 y 偏移量,以便将它们绘制到屏幕的可见部分之外:

enter image description here

整个内容都包含在 ScrollView 中,所以我希望我应该能够向下滚动到最后一个视图。

但是,它不会滚动超过测试 26。

如何通过分配偏移量并更新 ScrollView 的 contentSize 来安排 ZStack 内的视图?

解决方法

内容大小是由ScrollView内部的view的大小来计算的。所以我们唯一能做的就是改变视图大小。

默认情况下,VStack 大小是其中的视图的总大小(实际视图大小)。

在这种情况下,我们还可以使用 frame() 来更改大小。检查apple document

由于 VStack 将视图排列在中间,我们可以将其与 .top 对齐。

struct ContentView: View {
    var body: some View {
        ScrollView() {
            VStack {
                ForEach(0..<50) { index in
                    Text("Test \(index)")
                        .offset(x: 0,y: CGFloat(index * 20))
                }
            }
            .frame( height: 2000,alignment: .top) //<=here
            .border(Color.black)
        }
    }
}
,

如果我正确理解您的意图,那么您在这种情况下根本不需要偏移(SwiftUI 的工作方式不同)

    ScrollView {
        VStack {
            ForEach(0..<50) { index in
                Text("Test \(index)")   // << use .padding if needed
            }
        }
    }

注意:偏移不会改变视图布局,视图保持在创建它的同一个位置,但在偏移位置渲染;其他视图的帧也不受影响。请注意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。