2009-08-31 11 views
15

मेरे पास एक दृश्य है जो MainWindow.xib में लोड किया गया है। यह सिर्फ uiimageview के साथ एक दृश्य है जो पूरी स्क्रीन (320 x 480) पर एक छवि दिखाता है। एप्लिकेशन के लोड मैं इस दृश्य प्रदर्शित और उसके बाद मैं एकआईफोन - UIView addSubview गैप शीर्ष पर

[self.view addSubview:tabbarController.view]; 

टैब बार नियंत्रक सिर्फ 2 दृश्य नियंत्रकों से जोड़ रहे है के साथ एक UITabBarController है करते हैं। जब यह सबबार में टैबबार नियंत्रक का दृश्य जोड़ता है तो यह लगभग 20px के शीर्ष पर एक अंतर छोड़ देता है। मेरे ऐप में स्टेटस बार है लेकिन यह मूल रूप से दूसरे के लिए कमरा है। यह तब तक होता है जब तक कि मैं इसे अपने व्यू कंट्रोलर में नहीं जोड़ता:

self.view.frame = CGRectMake(0, 0, 320, 480); 

क्या कोई इसे समझा सकता है। मैं

self.view = tabbarController.view; 

पर बताया गया था लेकिन मुझे बताया गया कि मुझे ऐसा नहीं करना चाहिए। तो अब मैं एक सबव्यूव जोड़ रहा हूं, लेकिन मुझे समझ में नहीं आ रहा है कि मुझे 20px दिखाने के लिए मेरे दृश्य के CGRect को समायोजित क्यों करना है।

उत्तर

17

UITabBarController को यूआईविंडो के सबव्यूव के रूप में जोड़ा गया दृश्य देखने की उम्मीद है, न कि कुछ अन्य UIView के सबव्यू के रूप में। फ्रेम प्रॉपर्टी दृश्य के ऑफसेट को अपने पर्यवेक्षण में परिभाषित करती है, इसलिए UITabBarController कार्यान्वयन स्टेटस बार के लिए कमरे छोड़ने के लिए डिफ़ॉल्ट रूप से 20 पिक्सल तक अपने दृश्य के फ्रेम को ऑफ़सेट करता है। आप UITabBarController का उपयोग गैर-मानक तरीके से उस दृश्य में जोड़कर कर रहे हैं जो पहले से ही स्टेटस बार के लिए 20 पिक्सेल से ऑफसेट हो चुका है। UITabBarController अपने पर्यवेक्षण के सापेक्ष अतिरिक्त 20 पिक्सेल द्वारा अपने दृश्य को ऑफ़सेट करता है, जिससे आप जो अंतर देखते हैं।

इसे ठीक करने के लिए एक साफ रास्ता एक दृश्य के बजाय खिड़की के subview के रूप UITabBarController के दृश्य जोड़ने है:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view]; 

(नोट: keyWindow विधि केवल अपने विंडो वापस आ जाएगी अगर आप पहले से ही कहा है अन्यथा, आप अपने UIViewController पर एक विंडो प्रॉपर्टी सेट करना चाह सकते हैं।)

+0

स्पष्ट स्पष्टीकरण के लिए धन्यवाद। शायद मुझे वापस जाना चाहिए और मेरे ऐप का हिस्सा पुन: स्थापित करना चाहिए। मैं चीजों को सही तरीके से करना चाहता हूं, लेकिन मैंने सोचा कि ऐप प्रतिनिधि से व्यू कंट्रोलर तर्क को अलग करना बेहतर हो सकता है - इसलिए मेरा रूट व्यू कंट्रोलर जो कुछ भी चाहता है वह करता है। यह समझाएगा कि मेरे रूट व्यू कंट्रोलर में क्यों मैंने एक सबव्यूव के रूप में जोड़ने के बजाय self.view = tabbarController.view किया था, मुझे अंतर नहीं मिलेगा। बहुत बढ़िया जवाब। अगर मैं कर सकता तो मैं और अधिक वोट दूंगा। – Brian

+0

ऐसा लगता है जैसे आपकी वृत्ति यहाँ अच्छी थी। यह कोको टच में उन डिजाइन सीमाओं में से एक है जिसे हमें अभी आसपास काम करना है। ध्यान रखें कि आपको अपने ऐप प्रतिनिधि से अपनी विंडो में tabbarController.view जोड़ने की आवश्यकता नहीं है। आप इसे अपने व्यू कंट्रोलर में जोड़ सकते हैं यदि वह ऐसा कहां है जहां आपको लगता है कि यह सबसे ज्यादा समझ में आता है। आपको केवल विंडो ऑब्जेक्ट तक पहुंच की आवश्यकता है, या तो कुंजीविंडो विधि के माध्यम से, या इसे अपने नियंत्रक पर एक प्रॉपर्टी के रूप में एप्लिकेशन में वापस सेट करके डिफाईफिशिश लॉन्चिंग:। – cduhn

+0

लेकिन इसका मतलब यह नहीं है कि tabbarcontroller.view अब window.view का सबव्यूव्यू है? लेकिन मेरे मामले में यह सही नहीं है कि मेरे पास विज्ञापन दृश्य है, और फिर दूसरा सामग्रीदृश्य। और मैं contentview में tabbarcontroller.view जोड़ रहा हूं। इस फैशन में व्यू कंट्रोलर विज्ञापनों के आधार पर सामग्री/विज्ञापनदृश्य को संभालेगा। अगर मैं खिड़की पर tabbarcontroller.view जोड़ता हूं, तो मुझे नहीं लगता कि मैं अपने व्यू कंट्रोलर का उपयोग करके विचारों को संभालने में सक्षम हूं। तुम क्या सोचते हो? – LolaRun

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