簡體   English   中英

SWIFTUI 如何使用幾何圖形捕獲 VStack 高度(在顯示 VStack 之后)?

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

我想請教你一些幫助。 我正在嘗試使用幾何圖形捕獲VStack 高度,然后根據該VStack 高度值計算其子元素的高度(在 VStack 內)。

我當前的 VStack 視圖的圖像

我用VStack的.frame外面充滿整個屏幕。 然后我使用.borde r 來目視檢查它是否真的填滿了屏幕(它工作正常)

.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的大小發生變化,它會重新布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM