दिलचस्प पोस्ट
JSON ऑब्जेक्ट को जावास्क्रिप्ट सरणी में परिवर्तित करना मेरे एंड्रॉइड ऐप में टेक्स्टव्यू लिंक को संभाल लें कैसे पर्यावरण क्रॉन अनुकरण के साथ एक स्क्रिप्ट कार्यान्वित? PHP में वैकल्पिक पैरामीटर मान निर्दिष्ट करने का कोई तरीका? वैकल्पिक घोषणा (के & आर) सी वाक्य रचना बनाम प्रोटोटाइप के लिए सभी तालिकाएं कैसे प्राप्त करेंगी जो कि विदेशी कुंजियां हैं, जो कि विशिष्ट तालिका.column का संदर्भ देते हैं और उन विदेशी कुंजी के लिए मान हैं? JQuery UI स्वत: पूर्ण पर कोई परिणाम नहीं खोज रहा है PHP – बहुआयामी सरणी मानों तक पहुंच मैं पर्ल में दो स्ट्रिंग्स की तुलना कैसे करूं? एक सी # सरणी के लिए json कन्वर्ट? PHP में डेकोरेटर को कैसे कार्यान्वित करें? तालिका नाम सेट करने के लिए तैयार वक्तव्य का उपयोग करना जावास्क्रिप्ट; समान मूल के साथ टैब / विंडो के बीच संचार मैं asp.net MVC 3 रेजर विस्टस्टार्ट फ़ाइल में विभिन्न लेआउट कैसे निर्दिष्ट करूं? पता लगाएँ कि क्या एंड्रॉइड पर एक इंटरनेट कनेक्शन उपलब्ध है

लेआउट एसयूवीएव्स कहां है?

मेरे पास एक कस्टम दृश्य है जो layoutSubview दौरान layoutSubview संदेश नहीं मिल रहा है।

मेरे पास एक ऐसा दृश्य है जो स्क्रीन भरता है। अगर मैं नेवि बार की ऊंचाई को बदलता हूं तो इसमें स्क्रीन के निचले भाग में एक कस्टम उपदृश्य होता है जो सही ढंग से इंटरफ़ेस बिल्डर में बदल जाता है layoutSubviews कहा जाता है जब दृश्य बनाया जाता है, लेकिन फिर कभी नहीं। मेरे सबव्यूज़ ठीक से रखे गए हैं अगर मैं इन-कॉल स्टेटस बार को बंद कर देता हूं, तो सबव्यू के layoutSubviews को बिल्कुल भी नहीं बुलाया जाता है, भले ही मुख्य दृश्य उसका आकार बदल लेता है।

कौन से परिस्थितियों में layoutSubviews वास्तव में कहा जाता है?

मेरे autoresizesSubviews दृश्य के लिए मैं autoresizesSubviews रहा हूँ। और इंटरफ़ेस बिल्डर में मेरे ऊपर और नीचे स्ट्रट्स और ऊर्ध्वाधर तीर सेट हैं I

वेब के समाधान से एकत्रित समाधान "लेआउट एसयूवीएव्स कहां है?"

मेरे पास एक समान प्रश्न था, लेकिन जवाब से संतुष्ट नहीं था (या किसी भी मुझे नेट पर मिल सकता था), इसलिए मैंने इसे अभ्यास में करने की कोशिश की और यहां मुझे जो मिला है:

  • init layoutSubviews का कारण नहीं layoutSubviews को बुलाया (duh)
  • addSubview: कारण बनता है दृश्य को जोड़ा जा रहा है, इसे देखने के लिए जोड़ा गया दृश्य (लक्ष्य दृश्य), और लक्ष्य के सभी सबव्यूज़
  • setFrame बुद्धिमानी से कॉल setFrame दृश्य के दृश्य देखने के लिए केवल फ्रेम का आकार पैरामीटर अलग है
  • एक UIScrollView को स्क्रॉल करने के कारण layoutSubviews स्क्रॉलव्यू पर बुलाया जाने वाले दृश्य, और इसके पर्यवेक्षण
  • एक डिवाइस को घूर्णन करना केवल layoutSubview है मूल दृश्य पर दृश्य (प्रतिसाद दृश्य नियंत्रकों प्राथमिक दृश्य)
  • दृश्य को फिर से बदलना layoutSubviews को बुलाएगा

मेरे परिणाम – http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/

@adpirate द्वारा पिछले उत्तर पर बिल्डिंग, मैं थोड़ा आगे का प्रयोग किया और कुछ स्पष्टीकरण / सुधार के साथ आया था मुझे पता चला है कि layoutSubviews: को एक दृश्य पर बुलाया जाएगा यदि और केवल तभी:

  • अपनी सीमाएं (फ़्रेम नहीं) बदल गई
  • इसके प्रत्यक्ष उप-दृश्यों में से एक की सीमा बदल गई
  • दृश्य से देखने या निकाले जाने के लिए उपव्यू जोड़ा जाता है।

कुछ प्रासंगिक विवरण:

  • सीमाओं को केवल तब ही माना जाता है जब नया मान भिन्न होता है, जिसमें एक अलग मूल शामिल है । विशेष रूप से नोट करें कि layoutSubviews: जब भी कोई यूआईएसक्रोल दृश्य स्क्रॉल होता है, क्योंकि यह अपनी सीमाओं को बदलकर स्क्रॉल करता है 'मूल
  • फ़्रेम बदलने से ही सीमा बदल जाएगी, अगर आकार बदल गया है, जो वही स्थान है जो वैसे ही सीमा की संपत्ति के लिए प्रचारित है।
  • एक दृश्य की सीमा में एक बदलाव जो अभी तक किसी दृश्य पदानुक्रम में नहीं है, परिणामस्वरूप layoutSubviews: लिए एक कॉल होगा layoutSubviews: दृश्य layoutSubviews: जब दृश्य अंततः किसी दृश्य पदानुक्रम में जोड़ा जाता है
  • और सिर्फ पूर्णता के लिए: ये ट्रिगर सीधे setNeedsLayout नहीं कॉल setNeedsLayout , बल्कि सेट सेट्स setNeedsLayout कॉल करें, जो एक झंडे सेट / सेट करता है दृश्य पदानुक्रम में सभी दृश्यों के लिए रन लूप का प्रत्येक पुनरावृत्ति, इस ध्वज की जांच की जाती है। प्रत्येक दृश्य के लिए जहां फ़्लैग उठाया गया है, layoutSubviews: उस पर कहा जाता है और ध्वज रीसेट है। पदानुक्रम के ऊपर उच्च दृश्य देखे जायेंगे / पहले कहा जाएगा

BadPirate के उत्तर में कुछ अंक केवल आंशिक रूप से सही हैं:

  1. addSubView बिंदु के लिए

    addSubview कारण बनता है दृश्यों को जोड़ा जा रहा है, इसे (लक्षित दृश्य) में जोड़ा गया दृश्य, और लक्ष्य के सभी सबव्यूज पर कॉल किया जाना है।

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

    उदाहरण: यदि आपने UIView प्रोग्राम को मूल रूप से बनाया है (डिफ़ॉल्ट रूप से इसका कोई स्वत: स्वरूपित मुखौटा नहीं है), लेआउटस्ब्यूविव को केवल तभी बुलाया जाएगा जब UIView फ़्रेम प्रत्येक addSubview पर नहीं बदलेगा।

    यह इस तकनीक के माध्यम से है कि आवेदन का प्रदर्शन भी बढ़ता है।

  2. डिवाइस रोटेशन पॉइंट के लिए

    डिवाइस को घूर्णन करने से केवल लेआउट पर विचार किया जाता है मूल दृश्य पर दृश्य (दृश्य दृश्य नियंत्रक का प्राथमिक दृश्य)

    यह केवल तभी सही हो सकता है जब आपका कुलपति वीसी पदानुक्रम (रूट पर window.rootViewController ) में हो, तो यह सबसे आम मामला है। आईओएस 5 में, यदि आप एक वीसी बनाते हैं, लेकिन इसे किसी अन्य वीसी में जोड़ा नहीं जाता है, तो यह विजिटर उपकरण बारी बारी से होने पर कोई भी ध्यान नहीं देगा। इसलिए लेआउट पर कॉल करके इसके दृश्य को ध्यान नहीं मिलेगा।

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

सिम्युलेटेड सुविधाओं को बंद करना, फिर दृश्य का आकार बदलना और स्प्रिंग्स सेट करना सही ढंग से एनीमेशन होने के कारण होता है और मेरी विधि को बुलाया जाता है

इस डीबगिंग में एक अतिरिक्त समस्या यह है कि सिम्युलेटर ऐप का इजाजत देता है जब इन-कॉल की स्थिति को मेनू के माध्यम से टॉगल किया जाता है। ऐप को छोड़ दें = कोई डिबगर नहीं

कॉलिंग [self.view setNeedsLayout]; दृश्य में नियंत्रक इसे दृश्य कॉल करने के लिए बनाता है DidLayoutSubviews

https://developer.apple.com/library/prerelease/tvos/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html#//apple_ref/doc/uid/TP40009503-CH5-SW1

लेआउट परिवर्तन तब हो सकते हैं जब निम्न दृश्यों में से कोई एक दृश्य में होता है:

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

क्या आपने लेआउट पर विचार किया है IFNeeded?

दस्तावेज़ स्निपेट नीचे है एनीमेशन के दौरान स्पष्ट रूप से इस विधि को कॉल करने पर एनीमेशन क्या काम करता है?

लेआउटआइफ़्निडड यदि आवश्यक हो तो सबव्यूज़ को बाहर कर देता है

 - (void)layoutIfNeeded 

चर्चा ड्राइंग से पहले subviews के लेआउट को मजबूर करने के लिए इस पद्धति का उपयोग करें।

उपलब्धता आईफोन ओएस 2.0 और बाद में उपलब्ध है।

एसडीके 3 से 4 तक ओपन जीएल ऐप को माइग्रेट करते समय, लेआउट्सब्यूविव को और नहीं कहा जाता था। बहुत सारे मुकदमा और त्रुटि के बाद मैंने अंत में मेन विन्डो। एक्सबी खोला, विंडो ऑब्जेक्ट का चयन किया, निरीक्षक में विंडो विशेषता टैब (बाएं) और "लॉन्च पर विज़िबल" को चुना। ऐसा लगता है कि SDK 3 में यह अभी भी एक लेआउट SubView कॉल करता था, लेकिन 4 में नहीं था

हताशा के 6 घंटे के अंत में डाल दिया

पहेली का दूसरा हिस्सा यह है कि खिड़की की कुंजी बनानी चाहिए:

 [window makeKeyAndVisible]; 

इसके अलावा सबव्यूज़ स्वचालित रूप से आकार नहीं दिए जाते हैं।

एक और बल्कि अस्पष्ट, अभी तक बहुत महत्वपूर्ण मामला है जब layoutSubviews कभी नहीं बुलाया जाता है:

 class View: UIView { override class var layerClass: AnyClass { return Layer.self } class Layer: CALayer { override func layoutSublayers() { // if we don't call super.layoutSublayers() } } override func layoutSubviews() { // this never gets called by the OS! print(#function) } }