मैं आपसे कुछ मदद माँगना चाहता हूँ। मैं ज्यामिति का उपयोग करके VStack ऊंचाई कैप्चर करने का प्रयास कर रहा हूं और फिर उस VStack ऊंचाई मान के आधार पर, इसके चाइल्ड एलिमेंट की ऊंचाई (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()
    }
}

लोड होने के बाद मैं वीएसटैक के वास्तविक आकार को कैसे कैप्चर कर सकता हूं?
जब मैं ट्रिगर (ऑनएपियर) करता हूं तो वीएसटैक ऊंचाई सही दिखाई देती है, हालांकि मुझे इसे तुरंत कैप्चर करने की आवश्यकता है।

0
Linas 1 अप्रैल 2020, 18:28

1 उत्तर

सबसे बढ़िया उत्तर

अगर मैं आपके प्रश्नों को समझता हूं, तो आप बहुत करीब हैं — आपको बस 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 अपने आकार में परिवर्तन होने पर खुद को फिर से बाहर कर देगा।

1
nteissler 1 अप्रैल 2020, 15:43