2

我希望我LoadingTitle的屏幕宽度为 70%,所以我使用它,GeometryReader但它会使垂直尺寸扩大,并且我LoadingTitle需要更多的垂直空间。我希望它尽可能保持紧凑。

使用硬编码时,width: 300我得到了正确的布局(相对宽度除外):

struct ContentView: View {
    var body: some View {
        VStack(alignment: .leading, spacing: 0) {
            LoadingTitle()
            Color.blue
        }
    }
}

struct LoadingTitle: View {
    var body: some View {
        HStack() {
                Color.gray
            }
            .frame(width: 300, height: 22)
            .padding(.vertical, 20)
            .border(Color.gray, width: 1)
    }
}

在此处输入图像描述

body现在,如果我将my包裹在LoadingTitle其中,GeometryReader我可以获得正确的相对大小,但随后GeometryReader会垂直扩展我的视图:

struct LoadingTitle: View {

    var body: some View {
        GeometryReader { geo in
            HStack() {
                Color.gray
                    .frame(width: geo.size.width * 0.7, height: 22, alignment: .leading)
                Spacer()
            }
            .padding(.vertical, 20)
            .border(Color.gray, width: 1)
        }
    }
}

在此处输入图像描述

我尝试按照其他建议.fixedSize(horizontal: false, vertical: true)使用,但结果视图过于紧凑,并且其所有填充都被忽略:GeometryReader

在此处输入图像描述

如何以相对宽度实现第一个屏幕截图的布局?

4

2 回答 2

2

这是可能的方法。使用 Xcode 11.4 / iOS 13.4 测试(未更改 ContentView)

演示

struct LoadingTitle: View {

    var body: some View {
        VStack { Color.clear }
            .frame(height: 22).frame(maxWidth: .infinity)
            .padding(.vertical, 20)
            .overlay(
                GeometryReader { geo in
                    HStack {
                        HStack {
                            Color.gray
                                .frame(width: geo.size.width * 0.7, height: 22)
                        }
                        .padding(.vertical, 20)
                        .border(Color.gray, width: 1)
                        Spacer()
                    }
                }
            )
    }
}
于 2020-04-19T07:21:08.187 回答
0

因为你有一个固定的标题高度,

struct LoadingTitle1: View {
    var body: some View {
        GeometryReader { geo in
            HStack {
                Color.gray.frame(width: geo.size.width * 0.7)
                .padding(.vertical, 20)
                .border(Color.gray, width: 1)
                
                Spacer()
            }
        }.frame(height: 62)
    }
}
于 2021-09-20T08:58:32.247 回答