2011-05-27 31 views
5

leftBarButtonItem此保證金邏輯任何人都可以向我解釋在這個屏幕截圖下面看到的邊距是從哪裏來的?我希望紅色,綠色和藍色矩形在屏幕布局,風景和肖像中都能夠彼此相鄰。相反,我在這些觀點之間看到了莫名其妙的利潤。解釋爲leftBarButtonItem,rightBarButtonItem,titleView

// 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

真正困擾我的是,觀點之間的利潤率空間變大可以變小?我不明白他們爲什麼在那裏,也不明白他們爲什麼會違揹我期望的利潤。

謝謝!

+0

如果你不使用靈活的寬度會發生什麼? – 2011-05-27 22:58:33

+0

如果我不使用柔性寬度,綠色塊保持其寬度相同,與左側對齊,藍色和紅色右對齊,綠色和藍色之間出現較大間隙。但是,這些差距的存在本身就是我不瞭解的。 – esilver 2011-05-28 20:12:14

+1

嘿,順便說一下,蘋果文檔說,當leftBarButton項不爲零時,titleView將被忽略。你意識到這點了嗎?你有解決方法嗎? – kris 2011-10-11 19:34:44

回答

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 2011-05-29 17:15:03

+0

其實我只是加了一行: self.navigationItem.titleView = self.customNavigationToolbar 當你前後走時使用subViews不能正確轉換 – esilver 2011-06-09 07:34:07

+0

@esilver不要在navigationItem上設置titleView。相反,將子視圖添加到navigationBar。navigationItem是navigationBar的一種特殊類型的子視圖,並且通過系統獲得特殊(有時未定義,正如Erik指出的那樣)。這個想法是完全忽略navigationItem並直接添加自己的子視圖到navigationBar。 – 2015-05-21 08:01:39

相關問題