SwiftUI ScrollView无法向下滚动到ZStack的所有内容

jyztefdp  于 2023-11-16  发布在  Swift
关注(0)|答案(2)|浏览(131)

SwiftUI ScrollView无法向下滚动到包含的ZStack的所有内容。

struct TestView: View {
    var colors: [Color] = [.red, .orange, .yellow, .green, .mint, .teal, .cyan, .blue, .indigo, .purple, .pink, .brown ]

    var body: some View {
        ScrollView {
            ZStack {
                ForEach(0..<10) {i in
                    RoundedRectangle(cornerSize: CGSize(width: 30, height: 30))
                        .fill(colors[i])
                        .frame(width: 300, height: 300 )
                        .offset(x: 0, y: CGFloat(i) * 200)
                }
            }
        }
    }
}

字符串

q0qdq0h2

q0qdq0h21#

您遇到的问题是ZStackoffset一起使用造成的。offset不会调整视图的边框。如果您设置了ZStack的背景色,您会发现它并不包含所有的矩形。


的数据
另外,ZStack的默认对齐方式是.center,这不是您想要的。
要解决这个问题,您可以做很多事情。首先,您可以在每个视图中添加垂直填充来代替偏移量。同时设置ZStack顶部的对齐方式:

var body: some View {
        ScrollView() {
            ZStack(alignment: .top) {
                ForEach(0..<colors.count) { index in
                    RoundedRectangle(cornerRadius: 30)
                        .fill(colors[index])
                        .frame(width: 300, height: 300)
                        .padding(.top, CGFloat(index) * 100)
                }
            }
        }
    }

字符串


mrphzbgm

mrphzbgm2#

感谢ColdLogic指出了两个关键点:偏移量不会改变ZStack的大小; ZStack的默认对齐方式是居中。因此,使用ScrollView和ZStack偏移量的唯一方法似乎是将框架高度设置为ZStack内容的实际高度。
代码如下:

struct TestView: View {
    var colors: [Color] = [.red, .orange, .yellow, .green, .mint, .teal, .cyan, .blue, .indigo, .purple, .pink, .brown ]

    var body: some View {
        ScrollView {
                ZStack(alignment: .top) {
                    Color.black
                    ForEach(0..<colors.count) {i in
                        RoundedRectangle(cornerSize: CGSize(width: 30, height: 30))
                            .fill(colors[i])
                            .frame(width: 300, height: 300 )
                            .offset(x: 0, y: CGFloat(i) * 200)
                    }
                }
                .frame(height: CGFloat(200*(colors.count-1))+300)
        }
    }
}

字符串

相关问题