SWIFTUI 如何使用几何捕获 VStack 高度(显示 VStack 之后)?

SWIFTUI How to capture VStack height with geometry (after the VStack was displayed)?

我想请你帮忙。我正在尝试使用 geometry 捕获 VStack height 然后基于该 VStack height 值,计算它的子元素的高度(在 VStack 内)。

Image of my current view of 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 如果它的大小发生变化,它会重新布局。