Swiftui GeometryReader不需要的全高/全宽特性

Swiftui GeometryReader不需要的全高/全宽特性,swiftui,Swiftui,我正在使用GeometryReader来确保图像的宽度永远不会超过屏幕宽度的一半。但是,由于GeometryReader请求视图的全高/全宽(如图中绿色背景所示),它会弄乱我视图的其余部分。好像它插入了不需要的间隔垫圈() struct ContentView:View{ var body:一些观点{ VStack{ VStack{ GeometryReader{g in HStack{ 文本(“文本左”)。背景(颜色。黄色) 图像(系统名称:“选中标记”) .可调整大小() .aspectRa

我正在使用
GeometryReader
来确保图像的宽度永远不会超过屏幕宽度的一半。但是,由于
GeometryReader
请求视图的全高/全宽(如图中绿色背景所示),它会弄乱我视图的其余部分。好像它插入了不需要的
间隔垫圈()

struct ContentView:View{
var body:一些观点{
VStack{
VStack{
GeometryReader{g in
HStack{
文本(“文本左”)。背景(颜色。黄色)
图像(系统名称:“选中标记”)
.可调整大小()
.aspectRatio(内容模式:.fit)
.frame(最大宽度:g.size.width/2)
}.背景(颜色.黄色)
}.背景(颜色.绿色)
}
文本(“底部文本”)
//此间隔符应将“底部文本”推到其他文本和图像的正下方
垫片()
}
}
}

如果我移除
GeometryReader
并将宽度设置为固定大小,它将按预期工作,绿色背景不会显示

struct ContentView:View{
var body:一些观点{
VStack{
VStack{
HStack{
文本(“文本左”)。背景(颜色。黄色)
图像(系统名称:“选中标记”)
.可调整大小()
.aspectRatio(内容模式:.fit)
.帧(最大宽度:200)
}.背景(颜色.黄色)
}.背景(颜色.绿色)
文本(“底部文本”)
垫片()
}
}
}
这是一个错误还是如何使用
GeometryReader
实现动态宽度


为什么在vstack中设置geometryreader?也许你有理由…但我认为,这种方式,你想怎么做就怎么做

但是是的,你是对的,geometryreader的东西很奇怪

 GeometryReader{ g in

            VStack{
                VStack {
                    HStack{
                        Text("Text Left").background(Color.yellow)
                        Image(systemName: "checkmark")
                            .resizable()
                            .aspectRatio(contentMode:.fit)
                            .frame(maxWidth: g.size.width/2)
                            .background(Color.red)
                    }.background(Color.yellow)

                }
                Text("Bottom Text")

                // This Spacer should push the "Bottom Text" right below the other Text and Image
                Spacer()
            }
        }.background(Color.green)

我的布局比这个示例更复杂,有许多嵌套视图。因此,我需要在子视图中使用它,而不是像最外面的视图那样使用它。啊,好吧……我不知道。一切都如预期的那样。GeometryReader使用父容器建议的所有可用空间,因此在您的情况下,只有底部文本定义了大小,它是固定的,GeometryReader使用的所有其他内容。间隔器总是消耗剩余空间(实际上是因为内部有自己的GeometryReader),所以在这种情况下,什么都没有,因为它是最后一个。没有魔法。您所需要的只是
UIScreen.main.bounds
。GeometryReader有不同的用途。好的,谢谢你的解释
UIScreen.main.bounds
仅部分适用于此示例。如果该设备被转换为风景,它不考虑新的宽度(<代码> GeometryReader < /代码>但是)。一旦一个有多个嵌套视图,<代码> GeometyReader < /代码>会产生意想不到的布局IO。你有什么想法吗?如何在子组件中使用
GeometryReader
,而不使用父视图中的所有可用空间?是否解决了此问题?你知道任何可能的解决办法吗?