SwiftUI GeometryReader紧凑型尺寸

SwiftUI GeometryReader紧凑型尺寸,swiftui,geometryreader,Swiftui,Geometryreader,我希望我的LoadingTitle具有70%的屏幕宽度,因此我使用GeometryReader,但它会使垂直尺寸扩大,我的LoadingTitle占用更多的垂直空间。我希望它尽可能紧凑 使用硬编码宽度:300时,我得到了正确的布局(相对宽度除外): 现在,如果我将我的LoadingTitle的主体包装在GeometryReader中,我可以得到正确的相对大小,但是GeometryReader会垂直扩展我的视图: struct LoadingTitle: View { var body

我希望我的
LoadingTitle
具有70%的屏幕宽度,因此我使用
GeometryReader
,但它会使垂直尺寸扩大,我的
LoadingTitle
占用更多的垂直空间。我希望它尽可能紧凑

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

现在,如果我将我的
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)
        }
    }
}

我尝试在
GeometryReader
上使用
.fixedSize(水平:假,垂直:真)
,但结果视图过于紧凑,所有填充都被忽略:


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

这里是可能的方法。使用Xcode 11.4/iOS 13.4进行测试(不含ContentView)


很好,谢谢。我相信我们也可以使用
而不是
VStack
,并从
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)
        }
    }
}
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()
                    }
                }
            )
    }
}