2012-09-28 3 views
9

मैं autoresizesSubviews को अक्षम करना चाहता हूं और मेरे सभी सबव्यूस को रखने के लिए setFrame का उपयोग करना पसंद करता हूं। आईओएस 6 के रूप में, चीजें बहुत बदल गई हैं। जब मैं viewDidLoad में दृश्य पर सेटफ्रेम को कॉल करता हूं, तो इसका कोई प्रभाव नहीं पड़ता है। मैंने इसे viewWillAppear से आजमाया; वही चीज।आईओएस: setFrame अब दृश्य से काम नहीं कर रहा है DidLoad या viewWillAppear

एक setFrame कॉल willAnimateRotationToInterfaceOrientation में काम करेंगे, लेकिन वह नहीं बुलाया जाता है शुरू में है जैसे कि यह आईओएस में था 5.

कोई स्पष्ट कर सकता हूँ कृपया मैं कहाँ से मेरे विचार लेआउट की उम्मीद कर रहा हूँ?

+0

क्या आपने ऑटोलायआउट को भी अक्षम कर दिया था? – Philip007

उत्तर

19

मुझे लगता है कि आप UIViewController से अपने विचार लेआउट करना चाहते हैं। एप्पल के प्रलेखन के अनुसार

- (void)viewDidLayoutSubviews 

:

आपका दृश्य नियंत्रक करने के बाद दृश्य अपने subviews बाहर देता है परिवर्तन करने के लिए इस विधि ओवरराइड कर सकते हैं आप viewDidLayoutSubviews में अपने लेआउट कार्य प्रदर्शन कोशिश की है।

आपके विचार ही लेआउट अपने subviews नहीं करता है (यदि आप AutoSize, autolayout का उपयोग नहीं करते या layoutSubViews :) आप इस विधि में लेआउट कार्य कर सकते हैं के बाद से

फिर भी, सुरुचिपूर्ण तरीका कस्टम माता-पिता UIView का उपयोग करना होगा और UIView के layoutSubViews: पर ओवरराइड करने के लिए सभी लेआउट का प्रदर्शन करना होगा (जब तक कि आप दृश्यमान रूप से दृश्यों को जोड़/हटा नहीं देते)। "How View Controllers Participate in the View Layout Process" पर एप्पल के दस्तावेज़ से उद्धरण:

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

+0

विचारों को स्वयं से बाहर रखने के लिए पूछना मुझे समझ में नहीं आता है। विचारों को यह कहने का अधिकार नहीं है कि उन्हें कहां जाना चाहिए। यह नियंत्रक की भूमिका है, है ना? – Prog

+0

UIViewController में एक व्यू प्रॉपर्टी है जो एक दृश्य को इंगित करती है: व्यू कंट्रोलर की सामग्री दृश्य। यह एकल दृश्य आपके नियंत्रक से संबंधित सब कुछ प्रदर्शित करने के लिए ज़िम्मेदार है। सिद्धांत रूप में यह एकल दृश्य इसके सभी सबव्यूज़ जानता है और इसलिए उनका लेआउट भी है। कृपया विचार करें कि दृश्य नियंत्रक के पास "viewDidLayoutSubviews" नामक विधि क्यों है। क्योंकि सबव्यूज़ का लेआउट (सामग्री) दृश्य की ज़िम्मेदारी होना चाहिए। यह सच है कि नियंत्रक से सबव्यूज़ लेआउट करना भी संभव है और यह एक आवश्यक अभ्यास नहीं है। –

+0

मुझे हमेशा ऐप्पल का विचार मिला है कि ऑटोरेसाइजिंग का उपयोग मस्तिष्क-मृत होने के लिए किया जाना चाहिए। क्या उन्होंने कभी उपयोगकर्ता-इंटरफ़ेस डिज़ाइन पर कोई पुस्तक नहीं पढ़ी है? एक स्वचालित दृश्य आकार बदलने तंत्र कभी सबव्यू के आदर्श लेआउट का उत्पादन नहीं करेगा। लेआउट को उस व्यक्ति द्वारा किया जाना चाहिए जिसने यूआई डिज़ाइन किया था। स्वचालित दृष्टिकोण अच्छे डिजाइन के लिए विरोधाभासी है, और मुझे हैरान है कि पूर्व में स्टीव जॉब्स द्वारा संचालित एक कंपनी उस दृष्टिकोण की वकालत करेगी। शायद, यदि आपका एकमात्र सबव्यू कुछ टेबल है, तो स्वचालित लेआउट उपयुक्त है। लेकिन अगर आपके पास विभिन्न प्रकार के सबव्यूव हैं तो स्वचालित लेआउट में कोई बात नहीं है। – Prog

0

के बारे में "विचारों पूछ खुद को बाहर रखना मेरे लिए कोई मतलब नहीं है। दृश्य अधिकार, जहां वे जाना चाहिए कहने के लिए नहीं है। यही कारण है कि नियंत्रक की भूमिका है, है ना?"। मुझे लगता है कि जवाब अक्सर नकारात्मक होता है। यह मूल दृश्य है (नियंत्रक को नहीं देखें) जो आम तौर पर अपने स्वयं के सबव्यूज़ को प्रस्तुत करने की भूमिका निभाता है। यह autoresizingMask या autolayout (केवल आईओएस 6) का उपयोग करके ऐसा करता है। या आप मूल दृश्य के -layoutSubviews विधि को ओवरराइड करके प्रोग्रामेटिक रूप से लेआउट बना सकते हैं।

निश्चित रूप से, इम्रे का उल्लेख है, नियंत्रक लेआउट प्रक्रिया में भाग ले सकता है साथ ही - (void)viewDidLayoutSubviews ओवरराइड कर सकता है। मैं अक्सर इस दृष्टिकोण का उपयोग करता हूं जब मैं चीजों को सरल रखने के लिए दृश्य नियंत्रक के शीर्ष स्तर दृश्य को उप-वर्ग नहीं करना चाहता हूं।

अंत में, मुझे यह post सुपर उपयोगी मिला। यहां तक ​​कि कुछ मामूली त्रुटियों के साथ, पोस्ट दृश्य लेआउट प्रक्रिया की एक बड़ी तस्वीर प्रदान करता है।

3

यदि आप इंटरफ़ेस बिल्डर में Autolayout विकल्प को अनचेक करते हैं तो आप में setFrame का उपयोग कर सकते हैं। यदि आपको ऑटो लेआउट का उपयोग करने की आवश्यकता है, तो आपको viewDidLayoutSubviews: में अपने लेआउट कार्यों को करने की आवश्यकता है।

Uncheck Autolayout in Interface Builder

+0

वाह, उसे पकड़ नहीं लिया। सिर के लिए धन्यवाद, अब मैं अपने सभी शुरुआती लेआउट को देखने में देख रहा हूं। विल्लएपियर। –

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