2010-01-27 7 views
10

मेरे कुछ एप्लिकेशन डिज़ाइनों में या केवल कुछ UIViews के लिए, नेविगेशन नियंत्रक के पुश व्यू कंट्रोलर के बाद, मेरा नया दृश्य स्टेटस बार की ऊंचाई से विंडो को स्थानांतरित कर दिया जाएगा। नतीजतन, मैं इस कोड स्टब कोडिडलोड विधि में रखूंगा।नेविगेशन के बाद मेरे कुछ UIViews कैसे स्थानांतरित किए जाते हैं?

CGRect frameAt = [self.view frame]; 
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
frameAt.origin.y += statusBarFrame.size.height; 
[self.view setFrame: frameAt]; 

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

ध्यान दें, कि ज्यादातर समय मैं कुछ मामूली अनुकूलन के साथ आईबी का उपयोग करके अपने विचारों को डिजाइन करने का प्रयास करता हूं।

क्या कोई और इसमें भाग लेता है और जानता है कि वे कोड कोड के बिना ठीक करने के लिए क्या करते हैं?

+0

यह भी ध्यान दें, मैंने 'अनुरूपित स्थिति' सेटिंग के साथ खेला है और कम से कम एक बार, जो सही समायोजन करता है, इसलिए मुझे कोड में परिवर्तन करने की आवश्यकता नहीं थी। – mobibob

उत्तर

16

मैं Apple's NavBar sample code का उपयोग किया है कोशिश करते हैं और इस समस्या को पुन: पेश करने।

applicationDidFinishLaunching मूल रूप से इस तरह कार्यान्वित किया जाता है:

[window addSubview:navigationController.view]; 
[window makeKeyAndVisible]; 

यदि मैं यह करने के लिए बदल:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil]; 
[shellController.view addSubview:navigationController.view]; 
[window addSubview:shellController.view]; 
[window makeKeyAndVisible]; 

तब मैं खाई दिखाई दे रहा हो।

लेकिन अगर मैं केवल यह कर:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
[shell addSubview:navigationController.view]; 
[window addSubview:shell]; 
[window makeKeyAndVisible]; 

फिर सब कुछ सामान्य लग रहा है।

तो मुझे लगता है कि प्रत्येक दृश्य नियंत्रक इसके दृश्य को ऑफ़सेट कर देगा यदि इसका रूट व्यू कंट्रोलर है। लेकिन नेविगेशन नियंत्रक इस व्यवहार को ऑफ़सेट करने के लिए ओवरराइड करता है चाहे वह रूट व्यू कंट्रोलर है या नहीं। इसलिए मैं कहूंगा कि आपका अंतर दिखाई दे रहा है क्योंकि आपके पास पदानुक्रम में कहीं भी नेविगेशन नियंत्रक कम होना चाहिए।

+0

मुझे लगता है कि आप समस्या पर हैं। मैं अपना अन्य ऐप देखने जा रहा हूं जिसमें इस समस्या के साथ दो स्क्रीन हैं। मुझे लगता है कि मैंने उन UIViewControllers को एक UINavigationController जोड़ा होगा। लगभग 20 मिनट में वापस ... – mobibob

+0

रहस्य हल हो गया! बस इतना ही!!! मैं वास्तव में इसमें खोदने पर आपकी परिश्रम की सराहना करता हूं। मैंने मौजूदा UIViewControllers में नेविगेशन बार जोड़ने के लिए वास्तव में एक महान सिद्धांत सीखा है।जिस तरह से मैंने उन्हें किया था, उन्हें "UIView पदानुक्रम में कम" परिभाषित किया गया था; जैसे कि जब मैंने उन्हें कोड में आईबीओलेट के रूप में जोड़ा, आईबी में तत्काल लगाया और आईबी के एनवी नियंत्रक को मेरे कोड से आईबीओटलेट में लगा दिया, तो मुझे दोनों नेविगेशन फीचर जो मैं चाहता था और कोई कलाकृतियों को नहीं मिला। इसके अलावा, मेरी सेटिंग ने फ्रेम को जगह पर स्नैप करने के लिए परेशान 'कूद' का कारण बना दिया। यह मेरी समस्या का सही जवाब 110% है। – mobibob

+0

मैंने देखा कि मार्च, 10 में इसका उत्तर दिया गया था। सुनिश्चित नहीं है कि यह आईओएस 6 के साथ संगत है या नहीं। मुझे एक ही समस्या है, लेकिन अंतराल बार के नीचे अंतर है। यहां मेरा प्रश्न है: http://stackoverflow.com/questions/17790946/ios-containerview-with-modalview-gap-appears-after-dismissing-modal धन्यवाद। – user1107173

2

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

तो, पहली चीज़ जो आपको चाहिए वह दृश्य के फ्रेम को संशोधित करने से संबंधित सभी कोड को हटा दें।

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

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

यदि आप प्रोग्रामिक रूप से सबव्यूव्स जोड़ रहे हैं तो आपको प्रत्येक सबव्यू पर ऑटोरेसाइजिंग मास्क प्रॉपर्टी सेट करने की आवश्यकता है। Here's an explanation

आशा है कि मदद करता है!

+0

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

+0

मोशी, मैंने ब्रायन के प्रश्न और उत्तरदाताओं पर पढ़ा। उनमें से कई ने पाया कि उन्हें फ्रेम को अपने आकार में सेट करना है - जो मैंने किया है। यह अभिविन्यास पहचान या कुछ मौलिक के दौरान आकार की कुछ दौड़ की स्थिति की तरह लगता है। मैं अपने सबव्यूज 'ऑटोसाइजिंग की जांच करूंगा और यदि यह काम करता है, तो मैं आपको जवाब दूंगा। – mobibob

+0

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

1

मैंने इसी तरह के मुद्दों में भाग लिया है।मेरे पिछले दो सवालों की जाँच करें:

IPhone - After dismissing Modal View Controller - gap is left at top of page

IPhone - UIView addSubview Gap at top

+0

हाय ब्रायन, जैसा कि मैंने मोशी (उपरोक्त) को अपनी टिप्पणियों में उल्लेख किया है, मैंने आपके प्रश्नोत्तर की समीक्षा की है (जो मुझे लगता है कि मैंने अपना प्रश्न पूछने से पहले शोध किया था) और वे आशाजनक प्रतीत हुए, लेकिन उन्होंने मेरी समस्या का समाधान नहीं किया। इसके अलावा, मुझे लगता है कि फ्रेम को स्वयं की वर्तमान सेटिंग में सेट करना गलत समाधान है क्योंकि कुछ और गलत है। मैं अभी तक अनुत्तरित छोड़ने जा रहा हूं (मैंने अपने ऐप्स में से किसी एक के लिए समस्या का उत्तर दिया है, लेकिन मुझे नहीं लगता कि यह अन्य ऐप्स के लिए समाधान है)। – mobibob

+0

अच्छी चीजें - समस्या के मेरे आर एंड डी के लिए ये प्रतिक्रियाएं सहायक थीं और एसडीके में और अंतर्दृष्टि की पेशकश की, हालांकि, मोशी के जवाब ने मेरी समस्या को सीधे ठीक किया और कुछ साफ-सफाई दुष्प्रभाव थे। आप अपनी पुरानी समस्या पर फिर से विचार करना चाहेंगे और देखें कि यह एक बेहतर समाधान है या नहीं। - आपके प्रयास के लिए ईमानदारी से धन्यवाद। – mobibob

0

link text

ऐसा ही एक बग यहाँ चर्चा की है।

एनीमेशन भी सेट है? इसे YES पर सेट करने का प्रयास करें क्योंकि इस तरह की एक जैसी समस्या का सामना करना पड़ रहा था।

0

मोशी का जवाब बहुत उपयोगी था क्योंकि आखिरकार मैंने आईआईवी व्यू के आकार बदलने वाले गुणों को नियंत्रित करने के लिए आईबी में बिंदीदार/ठोस रेखाओं के अर्थ को महसूस किया।

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

दृश्य लोड करते समय, यदि उपयोगकर्ता ने अचानक पोर्ट्रेट से परिदृश्य तक डिवाइस का अभिविन्यास बदल दिया, तो दृश्य की सभी सामग्री स्टेटस बार की ऊंचाई से नीचे की ओर चली जाएगी। दृश्य नियंत्रण और उसके शीर्ष के बीच परिणामी अंतर पोर्ट्रेट अभिविन्यास पर वापस स्विच करने के बाद भी रहेगा।

क्या अंत में मेरी मुद्दों को हल किया, और मेरे शेष बाल, पंक्ति जोड़कर किया गया था:

self.view.frame = [[UIScreen mainScreen] bounds]; 

भीतर
-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

जब से मेरे विचार सामग्री अचानक डिवाइस अभिविन्यास परिवर्तनों के बावजूद जगह में आयोजित की जाती हैं।

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