2014-10-06 2 views
11

को आकार देने वाला नहीं में एम्बेडेड मैं एक xib फ़ाइल ऑटो लेआउट है कि मैं [[NSBundle mainBundle] loadNibNamed:@"name"][0] साथ instantiating कर रहा हूँ और addSubview: के माध्यम से करने के लिए एक प्रोग्राम के रूप में रूप से बनाए गए UIView को जोड़ने के साथ एक साधारण दृश्य का प्रतिनिधित्व किया है।ऑटो लेआउट XIB कार्यक्रम संबंधी UIView माता पिता

समस्या यह है कि दृश्य उस दृश्य के आकार को पूरा करने के लिए नहीं खींच रहा है जिसमें यह एम्बेड किया गया है; बल्कि यह xib फ़ाइल में निर्दिष्ट आकार के लिए डिफ़ॉल्ट रूप से प्रतीत होता है। (मुझे कंटेनर व्यू पर कंटेनर व्यू पर बाधाओं को सेट करने का कोई तरीका नहीं मिल सकता है, केवल इसके सबव्यूज़।)

कुछ हद तक अजीब बात है, जब मैं आईपैड घुमाता हूं, तो दृश्य की चौड़ाई आनुपातिक रूप से घट जाती है। तो यह स्पष्ट रूप से किसी भी तरह से तारित है, लेकिन गलत प्रारंभिक मूल्यों के साथ।

दृश्य एम्बेड पदानुक्रम को ठीक से फिट करने के लिए इस एम्बेडेड दृश्य को पाने के लिए मुझे कौन सा कनेक्शन याद आ रहा है?

स्क्रीनशॉट (मैजेंटा रंग डिबगिंग के लिए जोड़ा):

screenshot 1

चित्र को घुमाने के बाद:

screenshot 2

उत्तर

18

कारण यह अपने आप का आकार परिवर्तन नहीं करता है को भरने के लिए अपनी नई superview है कि आपने ऐसा करने के लिए व्यवस्था नहीं की है। संक्षेप में, आपको एक दूसरे को जोड़ने के बाद दो विचारों को जोड़ने के लिए कोड में बाधाएं जोड़ने की आवश्यकता है।

अधिकतर, आईबी ने अपने ऑटोरेसाइजिंग मास्क को बाधाओं में अनुवाद करने के लिए दृश्य सेट किया। ऑटो लेआउट का उपयोग करने के लिए सेट होने पर एनआईबी से निर्धारित करने के लिए इसका ऑटोराइजिंग मास्क क्या मुश्किल हो सकता है।

वैसे भी, जब आप इसे पर्यवेक्षण में जोड़ते हैं, तो स्वचालित रूप से जेनरेट की गई बाधाएं इसके वर्तमान फ्रेम को बनाए रखती हैं। जब पर्यवेक्षक का आकार बदलता है, तो वे इसे ऑटोरेसाइजिंग मास्क के अनुसार आकार बदलते हैं (संभवतः चौड़ाई और ऊंचाई को अलग करने की अनुमति देता है लेकिन पर्यवेक्षी किनारों की दूरी नहीं)।

आप ऑटो लेआउट का उपयोग कर रहे हैं, तो आप निम्न करना चाहिए:

  • या तो निब में translatesAutoresizingMaskIntoConstraints बंद कर देते हैं या कोड जो यह superview में जोड़ता में इसे बंद कर देते। आपके द्वारा उठाए गए उन दृष्टिकोणों पर निर्भर करता है कि आप इस बात पर निर्भर करते हैं कि दृश्य कभी भी एक फ्रेमवर्क व्यू क्लास के सबव्यूव के रूप में जोड़ा जाएगा जो इसके सबव्यूज़ के लेआउट का प्रबंधन करता है। यदि आप कर सकते हैं, तो आपको इसे एनआईबी में छोड़ देना चाहिए और उस वर्ग को यह तय करना चाहिए कि इसे बंद करना है या नहीं।

  • अपने पर्यवेक्षण में दृश्य जोड़ने के बाद, पर्यवेक्षण में बाधाएं जोड़ें जो नियंत्रित करता है कि दृश्य कहां रखा जाना चाहिए।

+5

सहायता के लिए धन्यवाद। यह बहुत खराब है Xcode इंटरफ़ेस बिल्डर में इसके लिए बाधाओं को स्थापित करने की अनुमति नहीं देता है। आम तौर पर मुझे कोड में चीजें करना पसंद है, लेकिन ऑटो लेआउट निश्चित रूप से उन चीजों में से एक नहीं है। ;) मैंने ** PureLayout ** लाइब्रेरी (https://github.com/smileyborg/PureLayout) इंस्टॉल करना समाप्त कर दिया है और इसकी 'autoPinEdgesToSuperviewEdgesWithInsets' विधि बहुत बढ़िया काम कर रही है। चीयर्स! – devios1

+2

आपका स्वागत है। बाधाएं दो विचारों से संबंधित हैं। एनआईबी को देखते हुए, पर्यवेक्षण मौजूद नहीं है, इसलिए बाधाओं से संबंधित कुछ भी नहीं है। इसके अलावा, एनआईबी में देखने के लिए बाधाओं को पर्यवेक्षण में जोड़ा जाना होगा।अंत में, एनआईबी देखने के लिए एक महत्वपूर्ण उपयोग केस विचारों के लिए है जिसका प्रयोग विभिन्न संदर्भों में किया जा सकता है। यह देखने के लिए उपयुक्त नहीं है कि यह मनमाने ढंग से संदर्भों में अपने परिवेश से कैसे संबंधित होगा। यह नियंत्रक के लिए एक नौकरी है जो इसे लोड करता है और इसे एक और दृश्य पदानुक्रम में जोड़ता है। –

+0

मैं अगर 3 साल इस बदल गया है पता नहीं है, लेकिन जब आप ने कहा, "एक दृश्य निब में, superview मौजूद नहीं है", मैंने सोचा: लेकिन एक स्टोरीबोर्ड में जहां उस वर्ग के एक दृश्य के एक दृश्य में रखा गया है पर्यवेक्षण को निर्धारित करने के लिए वहां पर्याप्त जानकारी होनी चाहिए। आईएमएचओ, आईबी को बस इसे संभालना चाहिए। जब तक मुझे कुछ याद नहीं आ रहा है और एक्सकोड लोग सिर्फ चिल्लाते हैं और कहते हैं कि यह क्षमता जोड़ने के लिए हमारे समय के लायक नहीं है। –

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