2010-01-10 19 views
48

में सबव्यूज़ को बाहर निकालना और आकार देना मेरे पास UITabController के साथ एक ऐप है और प्रत्येक टैब UINavigationController है। मेरे UINavigationControllers में से एक की रूट UIViewController है।UIViewController

उस दृश्य नियंत्रक के दृश्य के अंदर, मैं कुछ सबव्यूज़ लेआउट करना चाहता हूं, लेकिन मैं & कहां से बाहर निकलना चाहता हूं कि उन्हें संकल्प स्वतंत्र कैसे किया जाएगा (यानि 320px, 480px जैसे हार्डकोड मान नहीं, 44 पीएक्स, आदि)।

जब दृश्य पूरी तरह से लोड और लंबवत आईफोन पर प्रस्तुत किया जाता है, तो इसकी ऊंचाई 367px = 480 - 20 (स्टेटस बार) - 44 (एनएवी बार) - 49 (टैब बार) होगी।

व्यू कंट्रोलर के अंदर, मैं वर्तमान में viewDidLoad विधि के भीतर अपने सभी सबव्यूव्यूज़ तैयार करता हूं। हालांकि, ऐसा लगता है कि इस विधि के भीतर, दृश्य की वर्तमान ऊंचाई 460px (self.view.bounds.size.height) है। तो जब मेरे सबव्यूव्स सेट अप करते हैं, तो मैं कुछ भी आकारों की उचित गणना नहीं कर सकता।

viewWillAppear: विधि के भीतर, दृश्य यह उचित आकार है पता है, लेकिन वह & की स्थापना हर बार दृश्य दिखाई देगी (जैसे टैब परिवर्तन की गणना subview के फ्रेम या नेविगेशन ढेर पर बच्चे को देखने के नियंत्रकों से पॉपिंग का मतलब होगा।

viewWillAppear:?

में लेआउट के लिए ठीक से यह करने के लिए एक ही रास्ता मैं autoresizing गुण का उपयोग कर की कोशिश की है है (माता-पिता की autoresizesSubviews & autoresizingMask) लेकिन वे सब पर काम करने के लिए !? इन करें नहीं है एक बार दृश्य सभी सेटअप होने के बाद ही प्रभावी हो जाते हैं और फिर इसका आकार बदल जाता है (मैन्युअल/अभिविन्यास परिवर्तन?)।

मैं आभारी हूं अगर कोई मुझे बता सके कि ऑटोरेसाइजिंग क्यों काम नहीं कर रही है, और किसी भी आकार को हार्डकोडिंग से चीजों को कैसे रखना है।

उत्तर

32

autoresizesSubviews आपके मूल दृश्य पर सेट होना चाहिए, जबकि autoresizingMask को बच्चों के विचारों पर सेट किया जाना चाहिए - यह वह गलती है जिसे मैंने बनाया था ताकि आप भी कर सकें।

loadView में आपको अपने सबव्यूज़ का आकार फिट करना चाहिए, इस समय पैरेंट व्यू के आकार का आकार फिट होना चाहिए, और उसके बाद जब माता-पिता दृश्य 460 से 367 पिक्सेल में बदल दिया जाता है तो आपके उप-विचारों का भी आकार बदल जाएगा, आपके अनुसार ऊपर मास्क सेटिंग्स।

यदि यह विफल हो जाता है, तो दृश्य आकार को viewWillAppear के भीतर सेट करने में कुछ भी गलत नहीं है - हर बार ऐसा करने का प्रदर्शन प्रभाव नगण्य है।

यदि कुछ और काम नहीं करता है, तो हमेशा layoutSubviews: होता है - यदि आपको लगता है कि मैन्युअल लेआउट कर सकता है, तो सिस्टम का मानना ​​है कि लेआउट को बदलना पड़ सकता है। setNeedsLayout भी है: कि कभी-कभी मैं viewWillRotate:/viewDidRotate: आदि से आवेदक करता हूं लेकिन वास्तव में इसकी आवश्यकता नहीं होनी चाहिए और ऑटोरेसाइज पर्याप्त होना चाहिए।

संपादित करें: हाँ, layoutSubviews में कस्टम लेआउट तर्क को लागू करने के लिए जैसा कि मैंने उपरोक्त उल्लेख किया है, को UIView उपclass करने की आवश्यकता होगी।

+2

त्वरित स्पष्टीकरण, UIViewController के पास नहीं है, न ही लेआउट सबव्यूव्यूज़ को कॉल करें। यह UIView पर एक विधि है। हालांकि, आप लेआउटसब्यूव्यू नामक एक विधि बना सकते हैं और इसे देखने से कॉल करें WillAppear: – casademora

+1

या तो "लोड व्यू" नहीं है। मुझे लगता है कि आपका मतलब है "viewDidLoad", इस मामले में दृश्यों को देखने के लिए उन विचारों को रिलीज़ करने के लिए उल्लेखनीय है। – DougW

+0

एक लोडव्यू विधि है लेकिन देखेंडिडलोड आमतौर पर सबव्यूज़ –

40

आप UIViewController के viewWillLayoutSubviews के अंदर अपना लेआउट तर्क कर सकते हैं।

-(void)viewWillLayoutSubviews{ 
    [super viewWillLayoutSubviews]; 
    // Your layout logic here 
} 

डॉक्टर: कहा जाता है बस से पहले दृश्य नियंत्रक के दृष्टिकोण के layoutSubviews विधि शुरू हो जाती है। सबक्लास आवश्यकतानुसार कार्यान्वित कर सकते हैं। डिफ़ॉल्ट एक एनओपी है।

+2

कोई अंतर अगर मैं इसके बजाय viewDidLayoutSubviews का उपयोग करता हूं? –

संबंधित मुद्दे