我正在尝试使用GeometryReader放置视图。我用了GeometryReader 修改Rectangle()并将其放置在我期望的位置。但是,我想以编程方式 将y值设置为与VStack框架的顶部对齐。我以为我会读 文本字段的几何高度并使用它,但是我无法分配几何 即使我使用相同的概念来移动textField的尺寸到变量 矩形。
struct ContentView: View {
@State private var textHeight = 0.0
var body: some View {
VStack {
GeometryReader { geometry in
VStack {
Text("Title Text")
}
//self.textHeight = CGFloat(geometry.size.height)
}.border(Color.green)
GeometryReader { geometry in
Rectangle()
.path(in: CGRect(x: geometry.size.width - 50,
y: 0, width: geometry.size.width / 2.0,
height: geometry.size.height / 2))
.fill(Color.red)
}
}.frame(width: 150, height: 300).border(Color.black)
}
}
Xcode Beta 7,Catalina Beta 7 任何指导将不胜感激。
答案 0 :(得分:1)
问题是您使用的VStack
内部有两个GeometryReader
。 VStack
将其子级垂直放置,一个在另一个上方。您的第二个y=0
中的GeometryReader
是第一个GeometryReader
之后的第一个y 。我建议您更改设计UI的方式,例如,您可以通过以下方式获得相同的结果:
struct ContentView: View {
var body: some View {
GeometryReader { geometry in
VStack {
ZStack {
Rectangle()
.path(in: CGRect(x: geometry.size.width - 50, y: 0, width: geometry.size.width / 2.0, height: geometry.size.height / 4))
.fill(Color.red)
Text("Title Text")
.frame(width: geometry.size.width, height: geometry.size.height/2.0)
.border(Color.green)
}
Spacer()
}
}
.frame(width: 150, height: 300).border(Color.black)
}
}
结果是:
要向上或向下或向左/向右推动,您可以使用非常有用的Spacer
视图。
这是我的建议,但是如果您真的需要使用两个GeometryReader
,则必须这样做:
struct ContentView2: View {
@State private var textHeight = CGFloat(0)
private func firstContentView(geometry: GeometryProxy) -> some View {
textHeight = geometry.size.height
return Text("Title Text")
.position(x: geometry.size.width/2.0, y: geometry.size.height/2.0)
}
var body: some View {
VStack(spacing: 0) {
GeometryReader { geometry in
self.firstContentView(geometry: geometry)
}.border(Color.green)
GeometryReader { geometry in
Rectangle()
.path(in: CGRect(x: geometry.size.width - 50, y: -self.textHeight, width: geometry.size.width / 2.0, height: geometry.size.height / 2))
.fill(Color.red)
}
}.frame(width: 150, height: 300).border(Color.black)
}
}
但这是一个非常肮脏的解决方案。