SwiftUI。如何设置垫片的收缩行为?

时间:2019-12-02 09:15:08

标签: ios swift layout constraints swiftui

如果rgb视图的容器(VStack)与底部黑色视图不冲突,则如何设置rgb视图之间的默认间距(100pt)(例如iPhone 11 Pro Max)。如果没有100p高的空间,但是会缩小。(如屏幕截图中的iPhone SE)

我的代码:

struct ContentView: View {
    var body: some View {
        VStack(spacing: 0) {
            VStack(spacing: 0) {
                Rectangle()
                    .foregroundColor(.red)
                    .frame(height: 100)
                Spacer()
                    .frame(minHeight: 10, maxHeight: 100)
                Rectangle()
                    .foregroundColor(.green)
                    .frame(height: 100)
                Spacer()
                    .frame(minHeight: 10, maxHeight: 100)
                Rectangle()
                    .foregroundColor(.blue)
                    .frame(height: 100)
            }
            Spacer()
                .frame(minHeight: 10, maxHeight: 600)
            Rectangle() // keyboard
                .frame(height: 200)
        }
    }
}

所以问题是: 在iPhone 11 Pro Max上,maxHeight:100的垫片的高度= 10(而不是100)。 (黑视图和VStack之间的 BUT 空间允许)

我如何解释行为?

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

您需要将idealHeight.fixedSize一起使用Spacer

Spacer()
    .frame(minHeight: 10, idealHeight: 100, maxHeight: 600)
    .fixedSize()

答案 1 :(得分:0)

在最后一个垫片上使用垫片(minLength:10)。

struct ContentView: View {
    var body: some View {
        VStack(spacing: 0) {
            VStack(spacing: 0) {
                Rectangle()
                    .foregroundColor(.red)
                    .frame(height: 100)
                Spacer()
                    .frame(minHeight: 10, maxHeight: 100)
                Rectangle()
                    .foregroundColor(.green)
                    .frame(height: 100)
                Spacer()
                    .frame(minHeight: 10, maxHeight: 100)
                Rectangle()
                    .foregroundColor(.blue)
                    .frame(height: 100)
            }
            Spacer(minLength: 10)
            Rectangle() // keyboard
                .frame(height: 200)
        }
    }
}

代码中的问题是,当您将Spacer().frame(minHeight: 10, maxHeight: 600)之类的空格内包裹一个空格时,首先将其视为一个框架,然后再将该空格内的空格视为该空格。框架的默认布局优先级与其他视图相同。因此,父级将为其提供与内部VStack相同的空间量。通过删除frame修饰符,Spacer的布局优先级最低,因此,内部VStack将占用尽可能多的空间,除了spacer要求的至少10个点和该矩形的200个点之外。