SWIFTUI如何用几何图形捕捉VStack高度(显示VStack后)



我想请你帮忙。我正在尝试使用几何体捕获VStack height,然后根据的VStack height值计算其子元素的高度(在VStack内(。

我当前VStack 视图的图像

我在VStack之外使用了.frame来填充整个屏幕。然后我使用.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高度显示正确,但我需要立即捕获它。

如果我理解你的问题,你就很接近了——你只需要使用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的大小发生变化,它将重新进行布局。

最新更新