我有一个类似于这个问题的问题(目前没有答案):SwiftUI HStack with GeometryReader and paddings
不同的是,我的目标是在HStack内对齐两个视图,其中左视图获得可用宽度的1/3,右视图获得可用宽度的2/3。
在ChildView内使用GeometryReader
会破坏整个布局,因为它会填充高度。
以下是我的示例代码:
struct ContentView: View {
var body: some View {
VStack {
VStack(spacing: 5) {
ChildView().background(Color.yellow.opacity(0.4))
ChildView().background(Color.yellow.opacity(0.4))
Spacer()
}
.padding()
Spacer()
Text("Some random Text")
}
}
}
struct ChildView: View {
var body: some View {
GeometryReader { geo in
HStack {
Text("Left")
.frame(width: geo.size.width * (1/3))
Text("Right")
.frame(width: geo.size.width * (2/3))
.background(Color.red.opacity(0.4))
}
.frame(minWidth: 0, maxWidth: .infinity)
.background(Color.green.opacity(0.4))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这将导致以下结果:
现在,如果您将此视图嵌入其他视图中,则布局会完全混乱:
例如在ScrollView
中
那么如何实现所需的结果呢?即具有填充其所占空间并在两个子视图之间分割(1/3,2/3)的HStack
-ChildView?
编辑
正如回答中所述,我也忘记添加HStack(spacing: 0)
。 这是右侧子容器溢出的原因。
ScrollView
中,您期望ChildView
元素有多高?它们失去了计算内在大小的能力,因为没有高度来约束它们。 - jnpdx