2010-11-09 134 views
3

我感興趣的是有一個支持所有方向的UIViewController,並乾淨地使用兩個xib文件來設置它的子視圖。如何使用xib文件支持縱向和橫向方向?

一種可能性似乎是在每次旋轉時使用NSBundle的loadNibNamed:方法來加載新的視圖層次結構,但這看起來效率低下,並且可能具有不幸的副作用。例如,從nib文件重新加載後,我的所有視圖都將丟失以前的狀態,例如將文本添加到文本字段等。

有沒有更好的方法來做到這一點?

+0

是否有一個特定的原因,您的界面必須有足夠的差異,才能在縱向和橫向之間使用2個xib?在界面生成器中使用增長/附加自動調整設置,您幾乎可以始終讓UI自動旋轉。如果你絕對必須這樣做,我會一次加載,然後在輪換期間交換意見。 – slycrel 2010-11-09 06:52:49

+4

考慮到寬高比的顯着變化,我認爲選擇明顯不同的每個方向佈局是非常合理的。 – Tyler 2010-11-10 19:43:52

+0

我同意。舊帖子我在這裏發表評論,但我一直在尋找適合於此的解決方案,並且一直沒有找到。擁有與縱向視圖非常不同的橫向視圖是絕對合適的。以股票應用爲例。它以橫向模式顯示圖表!我不知道爲什麼每個人都說你不應該表現出不同的觀點並不斷依靠自動調整大小。對我自動調整大小是一個警察。景觀視圖幾乎是一個全新的環境,應該有一個特定的設計 - 可能還有其他有用的功能。 – Christopher 2012-06-13 05:36:21

回答

3

經過一些研究,我無法找到一個優雅的解決方案。因爲在每次旋轉時從xib文件重新加載元素看起來很慢並且消除了任何動態的基於視圖的數據,所以我切換到基於代碼的設置(即不再有xib文件)。

我決定建立這樣一個方法:

// This is for an iPad root-level view controller. 
- (void)setupForOrientation:(UIInterfaceOrientation)orientation { 
    if (UIInterfaceOrientationIsPortrait(orientation)) { 
    CGRect bounds = CGRectMake(0, 0, 768, 1004); 
    bkgImageView.frame = bounds; 
    // Other view positioning for portrait. 
    } else { 
    CGRect bounds = CGRectMake(0, 0, 1024, 748); 
    bkgImageView.frame = bounds; 
    // Other view positioning for landscape. 
    } 
    [self drawBackgroundForOrientation:orientation]; 
} 

這種方法是從shouldAutorotateToInterfaceOrientation:方法調用,遞給了新的方向。

+0

我使用相同的技術。感謝UIInterfaceOrientationIsPortrait宏! – rjobidon 2013-08-28 02:02:29

1

而不是從shouldAutorotateToInterfaceOrientation調用你的函數,你只需要說是或否,你應該真的在代理函數中做你的東西,比如willRotateToInterfaceOrientation,它的意思是做你正在做的事情。