2013-10-24 97 views
3

關於通過將UINavigationBar插入到場景中來設計您自己的視圖控制器,我發現許多有關如何在旋轉設備時幀高度不會改變的問題的參考。這與Apple如何在其導航控制器中使用UINavigationBar的方式形成鮮明對比,該控制器的旋轉高度會發生變化。UINavigationBar旋轉和自動佈局

儘管有些建議事實上顯示如何改變高度以與Apple所做的一致,但所有答案都沒有解決與場景中其他視圖的適當關係。特別是,在構建一個使用autoLayout的場景時,你不應該調整框架 - 自動佈局是通過你定義的約束爲你設計的。

例如,一個suggestion是要做到這一點:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)]; 
} 

雖然這將改變大小,其他視圖的關係不再正確。儘管上述示例中的海報確實提供瞭解決調整關係的解決方案,但這更像是一種硬編碼的方法,並非Apple可能提出的一種方法,即不是適用於AutoLayout的解決方案。

通過實驗,我注意到,在旋轉設備時,intrinsicContentSize實際上確實改變了,但是框架沒有改變。在注意到這一點,我試過如下:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    CGRect frame = self.navigationBar.frame; 
    frame.size.height = self.navigationBar.intrinsicContentSize.height; 
    self.navigationBar.frame = frame; 
} 

雖然這並適當改變大小,就像上面的例子中,它也造成了不正確觀點的關係。

具體來說,我的設備在景觀:

enter image description here

然後切換到肖像:

enter image description here

是任何人都知道蘋果怎麼要我們使用約束來解決UINavigationBar的佈局?

回答

1

只需在按鈕和頂部佈局指南之間進行垂直間距約束即可。這可以在IB中通過控制從按鈕拖動到導航欄的底部來完成。非常簡單,沒有必要的代碼。

編輯完成後:如果添加一個獨立的導航欄,您確實需要一些代碼(據我所知)來獲得您使用導航控制器自動獲取的行爲。我這樣做的方式是添加一個導航欄,並將其限制到超級視圖的兩側,對頂部佈局指南的垂直限制以及44點的固定高度。我爲此約束創建了一個IBOutlet(在下面的代碼中稱爲heightCon)。該按鈕對導航欄具有centerX約束和垂直間距約束。

- (void)viewWillLayoutSubviews { 
    self.heightCon.constant = (self.view.bounds.size.height > self.view.bounds.size.width)? 44 : 32; 
} 
+0

是的,這個建議將有助於上面的例子。但是,代碼是必需的,因爲導航欄的高度需要調整 - 這真的是帖子的要點。此外,我們的目標是在條形尺寸發生變化時保持按鈕和條之間的空間。 – zinc1oxide

+0

@ zinc1oxide,看起來他正在談論iPhone自動旋轉時的高度變化 - 沒有代碼是必要的。 – rdelmar

+0

旋轉時沒有自動高度變化。在上面的建議中,更改按鈕約束不會影響導航欄在旋轉時的高度。如果你知道通過定義約束來改變高度的方法,那將是理想的。 – zinc1oxide