我想请你帮忙。我试图使用几何捕获VStack高度,然后根据VStack高度值计算其子元素的高度(在VStack内)。
我使用.frame在VStack之外填充整个屏幕。然后,我使用.border直观地检查它是否实际填充了屏幕(工作正常)。
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: Alignment.topLeading)
问题可以在VStack内部看到,高度显示为GCFloat 734。尽管边框大小是,但要大得多。
struct BodyView: View {
@State var stackHeight : CGFloat = 0
var body: some View {
GeometryReader { geometry in
VStack {
Text("VStack size: \(self.stackHeight)")
.bold()
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal)
.background(Color.green)
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: Alignment.topLeading)
.onAppear{
self.stackHeight = geometry.size.height
}
.border(Color.purple, width: 5)
}
}
}
struct BodyView_Previews: PreviewProvider {
static var previews: some View {
BodyView()
}
}当VStack完成加载时,我如何捕获它的实际大小?
当我触发(onAppear)时,VStack的高度看起来是正确的,但是我需要立即捕获它。
发布于 2020-04-01 15:43:43
如果我理解你的问题,你很接近-你只需要使用GeometryProxy类型:
import SwiftUI
struct BodyView: View {
var body: some View {
GeometryReader { geometry in
VStack {
Text("VStack size: \(geometry.size.height)") // no need for state var anymore
.bold()
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal)
.background(Color.green)
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: Alignment.topLeading)
.border(Color.purple, width: 5)
}
}
}
struct BodyView_Previews: PreviewProvider {
static var previews: some View {
BodyView()
}
}如果GeometryReader的大小发生变化,它将再次显示出它自己。
https://stackoverflow.com/questions/60974522
复制相似问题