2013-04-24 9 views
14

नीचे कोडजब हम उपस्थित होते हैं तो हुड के तहत क्या होता है दृश्य नियंत्रक?

self.view.backgroundColor = [UIColor yellowColor]; 
MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] 
myVC.view.backgroundColor = [UIColor clearColor]; 
myVC.modalPresentationStyle = UIModalPresentationFullScreen; 
[self presentViewController:myVC animated:NO completion:nil]; 

क्या हुड जब हम presentViewController फोन के तहत होता है को देखते हुए? जब मेरीवीसी दिखाई दे रही है तो मुझे पीले रंग का रंग नहीं दिखाई दे रहा है, फिर मैंने myVC.view.superView को इसके दृश्य में देखा हैडिडपेपर विधि और यह UIWindow है।

प्रश्न 1। इसका मतलब यह है कि जब तक मोडल विंडो प्रस्तुत नहीं हो जाती है तब तक व्यू कंट्रोलर.व्यू (उपरोक्त मामले में स्वयं। दृश्य) दृश्य पदानुक्रम से हटा दिया गया है और प्रस्तुत दृश्यव्यू्रोलर.व्यू (उपरोक्त मामले में myVC.view) UIWindow पर जोड़ा गया है?

प्रश्न 2। यदि myVC.modalPresentationStyle! = UIModalPresentationFullScreen यदि मामला क्या होगा?

क्यू 3। क्या आईओआईविंडो से सभी दृश्यों को भी हटाया जाता है, प्रस्तुत किए गए ViewController.view को छोड़कर पूर्ण स्क्रीन मोडल संवाद अनुकूलन के लिए ऊपर है? यदि नहीं तो क्यों नहीं?

+0

'clippingVC' क्या है? – rptwsthi

उत्तर

18

सबसे पहले, आइए बिना एनीमेशन के मामले पर चर्चा करें। आपका खिड़की एक दृश्य पदानुक्रम, अपने rootViewController दृश्य से शुरू हो गया है

  1. :

    present कॉल करने से पहले।

present:

  1. कॉल करने के बाद दृश्य पदानुक्रम अभी भी बदलाव के बिना मौजूद है।
  2. "डमींग व्यू" नामक एक विशेष पूर्ण-स्क्रीन दृश्य विंडो में जोड़ा गया है (यानी, rootViewController के दृश्य के अंदर नहीं है, लेकिन विंडो के अंदर (विंडो UIView भी है)। यह दृश्य पारदर्शी है, मंद हो जाता है पेश controler और ब्लॉक उपयोगकर्ता बातचीत।
  3. प्रस्तुत (मोडल) नियंत्रक के दृश्य तो खिड़की के भी जोड़ा जाता है।

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

एनिमेटेड केस लगभग समान है। केवल चरणों के बीच कुछ फैंसी एनिमेशन हैं।

संपादित करें 2: उत्तर वास्तव में थोड़ा गलत था। आईफोन और आईपैड प्रस्तुत नियंत्रकों के बीच एक बड़ा अंतर है।

आईफोन पर, प्रस्तुत नियंत्रक हमेशा पूर्ण स्क्रीन प्रदर्शित होते हैं और प्रस्तुत करने वाले नियंत्रक वास्तव में खिड़की से हटा दिए जाते हैं।

आईपैड पर, यदि प्रस्तुत नियंत्रक पूर्णस्क्रीन नहीं है (UIModalPresentationStyle देखें), प्रस्तुत नियंत्रक विंडो में रहता है।

आपका प्रश्न:

मतलब जब तक मोडल विंडो (उपरोक्त मामले में self.view) देखें पदानुक्रम और उपरोक्त मामले में presentedViewController.view (myVC.view से निकाल दिया जाता presentingViewController.view ऊपर है) UIWindow पर जोड़ा गया है?

यदि नियंत्रक पूर्ण स्क्रीन है, तो यह दावा सत्य है। अन्यथा, प्रस्तुत करने वाला दृश्य नियंत्रक वहां रहता है लेकिन पूरी सामग्री अन्य विचारों से ओवरलैप होती है (भले ही वे अर्ध-पारदर्शी हों)। साथ ही, प्रस्तुत और प्रस्तुत नियंत्रक विचारों के बीच हमेशा कुछ विचार होते हैं।

यदि myVC.modalPresentationStyle! = UIModalPresentationFullScreen यदि मामला क्या होगा?

पिछले प्रश्न का उत्तर देखें - आईफोन पर, कोई फर्क नहीं पड़ता।

क्या आईओएसआईविंडो से सभी दृश्यों को भी हटाया जाता है, सिवाय बिना दृश्य स्क्रीन नियंत्रक। पूर्ण स्क्रीन मोडल संवाद अनुकूलन के लिए ऊपर है? यदि नहीं तो क्यों नहीं?

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

संपादित करें: आप एक पारदर्शी नियंत्रक बनाना चाहते हैं, तो आप कर सकते हैं:

  1. दृश्य सीधे आपके विचार पदानुक्रम (या तो नियंत्रक के दृश्य करने के लिए या खिड़की करने के लिए) के लिए एक संक्रमण एनीमेशन के साथ जोड़े (+[UIView transition...])
  2. वही है लेकिन आपके नियंत्रक को बाल नियंत्रक भी जोड़ रहा है।
+2

यह उत्तर कुछ हद तक गलत है। जब एक मोडल पूर्ण-स्क्रीन नियंत्रक प्रस्तुत किया जाता है, तो UIKit विंडो से अन्य नियंत्रकों के विचारों को हटा देता है। वास्तव में, विंडो से अतिरिक्त/निकालना ठीक है '-viewDid/Will (Dis) प्रकट होता है:' विधियां रिपोर्टिंग कर रही हैं। लेकिन यूआईकिट उन्हें वापस जाने से पहले विंडो में वापस जोड़ता है। –

+1

@BJHomer आप सही थे। मेरे पास ज्यादातर आईपैड प्रयोग है इसलिए मुझे आईफोन के मामलों में गलती हुई थी। जवाब तय किया गया। – Sulthan

+0

यह मेरे प्रयोगों से भी है -> "विंडो पदानुक्रम से केवल प्रस्तुत करने वाले नियंत्रक को हटा दिया गया है"। मुझे आशा है कि आईओएस खिड़की पदानुक्रम से अन्य सभी विचारों को कभी भी हटा नहीं सकता है। @ बीजे होमर यह कहकर गलत है कि "जब एक मोडल पूर्ण-स्क्रीन नियंत्रक प्रस्तुत किया जाता है, तो UIKit विंडो से अन्य नियंत्रकों के विचार हटा देता है।" – msk

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