2011-05-27 7 views
5

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

// Setup Left Bar Button item 
UIBlankToolbar* tools = [[[UIBlankToolbar alloc] initWithFrame:CGRectMake(0, 0, 115, 44)] autorelease]; 
tools.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
[tools setBackgroundColor:[UIColor greenColor]]; 
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease]; 

... 

// Setup Right Bar Button Item 
UIBlankToolbar* tools = [[[UIBlankToolbar alloc] initWithFrame:CGRectMake(0, 0, 100, 44)] autorelease]; 
[tools setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
[tools setBackgroundColor:[UIColor redColor]]; 
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease]; 

... 

// Setup Title View 
self.navigationItem.titleView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 44)] autorelease]; 
self.navigationItem.titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
[self.navigationItem.titleView setBackgroundColor:[UIColor blueColor]]; 

मैं इस कोड के साथ क्या देखें:

enter image description here enter image description here

क्या वास्तव में मुझे perplexes कि विचारों के बीच मार्जिन उपलब्ध स्थान के रूप में बड़ा हो छोटा हो जाता है है? मुझे समझ में नहीं आता कि वे वहां क्यों हैं, और न ही वे मार्जिन से क्या उम्मीद करते हैं, इसके विपरीत वे व्यवहार करते हैं।

धन्यवाद!

+0

यदि आप लचीली चौड़ाई का उपयोग नहीं करते हैं तो क्या होता है? –

+0

यदि मैं लचीली चौड़ाई का उपयोग नहीं करता हूं, तो हरा ब्लॉक बाईं ओर गठबंधन की समान चौड़ाई पर रहता है, नीले और लाल दाएं गठबंधन होते हैं, और हरे और नीले रंग के बीच एक बड़ा अंतर दिखाई देता है। लेकिन, उन अंतराल का अस्तित्व स्वयं ही है जो मुझे समझ में नहीं आता है। – esilver

+1

अरे, वैसे, सेब डॉक्टर कहते हैं कि टाइटलव्यू को अनदेखा कर दिया जाएगा जब बार्टबटन आइटम शून्य नहीं है। क्या आपको इसकी जानकारी है? क्या आपके पास कामकाज है? – kris

उत्तर

4

नेविगेशन बार में इसके आइटमों के बीच न्यूनतम मार्जिन है जो इसे लागू करता है और यही कारण है कि आप मार्जिन से छुटकारा नहीं पा सकते हैं।

अपने विशिष्ट कोड को समझा जाना बहुत मुश्किल नहीं है: 115+100+50 = 265 और स्क्रीन की चौड़ाई 320 है, इसलिए नेविगेशन बार में 55 पिक्सल मार्जिन के रूप में उपयोग करने के लिए हैं। बाएं आइटम को गठबंधन छोड़ दिया गया है, सही वस्तु सही गठबंधन है और मध्य वस्तु केंद्रित है। तो पोर्ट्रेट में प्राप्त मार्जिन सही समझ में आता है।

जो आप परिदृश्य में देख रहे हैं वह आपकी लचीली चौड़ाई के कारण है। आपको नेविगेशन बार में आइटम्स पर लचीला चौड़ाई नहीं माना जाता है, इसलिए ऐसा करने पर व्यवहार अनिर्धारित है, यानी, बग यह है कि आप नेविगेशन बार में कैसे नवाइन बार का उपयोग करते हैं।

क्या हो रहा है कि सही आइटम के लिए नया आकार पहले गणना की जाती है। यह 100 से 100+(480-320) = 260 तक बढ़ता है। फिर मध्य वस्तु के आकार की गणना की जाती है और ऐसा लगता है कि इसमें बस सभी आकार उपलब्ध हैं। जब बाएं आइटम की गणना करने का समय होता है तो यह वास्तव में सिकुड़ता है क्योंकि सही और मध्य वस्तु ने सभी जगह ले ली है, इसलिए जब नेविगेशन बार मार्जिन को लागू करता है तो बाएं आइटम से पिक्सल लिया जाता है।

वास्तविक एल्गोरिदम भिन्न हो सकता है। आखिरकार यह बंद स्रोत है और मैं अपरिभाषित व्यवहार को समझाने की कोशिश कर रहा हूं, लेकिन उत्पादित मार्जिन को देख रहा हूं जो ऐसा हो रहा है।

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

yourView = [[YourView alloc] initWithFrame:(UIInterfaceOrientationIsPortrait(interfaceOrientation)) ? CGRectMake(0, 0, 320, 44) : CGRectMake(0, 0, 480, 44)]; 
yourView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
[self.navigationController.navigationBar addSubview:yourView]; 
+0

यह समझ में आता है। धन्यवाद! – esilver

+0

असल में मैं सिर्फ लाइन कहा: self.navigationItem.titleView = self.customNavigationToolbar subviews का उपयोग ठीक से संक्रमण नहीं होती जब आप आगे और पीछे जाने के – esilver

+0

@esilver navigationItem पर titleView सेट न करें। इसके बजाय नेविगेशनबार में सबव्यू जोड़ें।नेविगेशनइटम नेविगेशनबार का एक विशेष प्रकार का सबव्यूव है और सिस्टम द्वारा उपचार (और कभी-कभी अपरिभाषित, जैसे एरिक पॉइंट आउट) हो जाता है। विचार नेविगेशन इटैम को पूरी तरह से अनदेखा करना है और नेविगेशनबार पर सीधे अपने स्वयं के सबव्यूव जोड़ना है। –

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