2011-03-03 80 views
19

我正在研究通用應用程序,並且我試圖在iPhone和iPad版本之間儘可能多地分享代碼。我需要使用TabBarController作爲我的根視圖控制器,儘管我想在每個選項卡中使用SplitViewController,但SplitViewController的文檔說它需要成爲根視圖控制器。因此,考慮到所有這些,理解我正試圖並行放置兩個導航控制器,並且(主要)複製SplitViewController的行爲/佈局。ViewController中的UINavigationController,位於視圖頂部的間隙

一切正常,除了視圖的佈局。當應用程序以縱向模式啓動時,當設備方向更改時,所有功能都會正常工作並調整大小/位置。

portrait orientation

如果該應用在除UIDeviceOrientationPortrait其他任何方向開始,則視圖顯示與導航控制器上方的20點間隙/餘量。我試過在運行時調整幀,但沒有完美的結果。將幀的原點調整爲-20並將高度增加20,可以使視圖與其父母的頂部齊平,但它會在底部留下20點的間隙!

landscape orientation

+0

爲什麼不調整幀中的每個旋轉'self.view.frame.size.height'? – 2011-03-03 16:55:33

+0

@sudo - 是的,我已經做到了這一點,這有助於...但只有當設備旋轉!如果應用程序以縱向(按鈕向下)以外的任何方向啓動,則它看起來像上一個屏幕截圖。我試過的沒有任何調整消除了差距。 – 2011-03-03 17:01:33

+0

他們嘗試將其設置爲[[UIScreen mainScreen]範圍] .size.height'? – 2011-03-03 17:03:49

回答

3

UINavigationController的通常顯示爲全屏幕控制器,這意味着它的視圖的頂部部分(當作爲窗口的根視圖控制器顯示)的狀態欄之下。然後,在狀態欄可見時,手動將其導航欄和內容視圖置於而不是的狀態欄下方。不幸的是,它在被某個其他視圖控制器定位時並不能真正處理事情,它(有時)會假定它需要保留20px的間隙而不檢查其視圖在狀態欄下的是否爲

解決的方法是將UINavigationController上的wantsFullScreenLayout設置爲NO,因此它甚至不會嘗試爲狀態欄留下空隙。

+1

謝謝,但這沒有什麼區別。 – 2011-03-03 17:30:15

+0

這是正確的解決方案。適用於我。 – 2013-04-06 03:15:09

3

我能夠蠻橫的力量如下。在viewDidLoadloadView

if (self.navigationController.navigationBar.frame.origin.y > 0.0) { 
    self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0); 
} 

而且在viewDidAppear:

if (self.view.superview.frame.origin.y > 44.0) { 
    UIView *container = self.view.superview; 
    container.frame = CGRectMake(container.frame.origin.x, container.frame.origin.y - 20.0, container.frame.size.width, container.frame.size.height + 20.0); 
} 

這是醜陋的,但它似乎工作。

-1

正確的答案是:

CGRect r = [[_navController view] frame]; 
r.origin = CGPointMake(0.0f, -20.0f); 
[[_navController view] setFrame:r]; 
2

不知道是否會有所幫助的,但我已經在過去也有類似的問題,已經能夠解決這個設置的框架將其添加到其超級視圖時,將UINavigationController視圖添加到CGRectZero。

在layoutSubviews當然我更新了UINavigationController視圖的框架。

+0

天才,工作! – 2011-11-18 19:05:32

2

將視圖控制器添加到選項卡時,這是一個常見問題。

從蘋果公司的文件(Tab Bar Controllers - Tab Bars and Full-Screen Layout):

標籤欄控制器支持全屏幕布局不同於大多數其他控制器支持的方式。如果您希望其視圖在狀態欄或導航欄(如果存在)的下方,您仍然可以將自定義視圖控制器的wantsFullScreenLayout屬性設置爲YES。但是,將此屬性設置爲YES不會導致視圖與選項卡欄視圖重疊。標籤欄控制器總是調整您的視圖的大小,以防止它在標籤欄下面。

在代碼的話,你應該做到以下幾點:

UINavigationController *myNavController = [[UINavigationView alloc] init]; 
myNavController.wantsFullScreenLayout = YES; 

//... 

NSArray* controllers = [NSArray arrayWithObjects:myNavController, nil]; 
myTabBarController.viewControllers = controllers; 

如果然而,你遇到的問題是,在比UIInterfaceOrientationPortraitmyNavController的動作來看其他方向打開應用程序時20像素離開屏幕頂部,那麼您將根據初始方向動態設置控制器的wantsFullScreenLayout屬性(而不是上述解決方案)。 我用你的導航控制器實現定義一個靜態變量它:

static UIInterfaceOrientation _initialOrientation = -1; 

之後,你需要重載viewDidAppear:方法,並適當設置變量:

- (void)viewDidAppear:(BOOL)animated 
{ 
    if (_initialOrientation == -1) 
    _initialOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    self.wantsFullScreenLayout = (_initialOrientation != UIInterfaceOrientationPortrait); 

    [super viewDidAppear:animated]; 
} 

希望這有助於。

25

我在添加導航控制器視圖後隱藏然後顯示導航欄,在我的應用程序中解決了這個問題。例如。

[parentView addSubview:navController.view]; 
[navController setNavigationBarHidden:YES]; 
[navController setNavigationBarHidden:NO]; 
+4

這對我很有用,我強烈建議這個解決方案勝過其他-20像素的黑客。 – 2012-09-13 12:44:54

+1

應該被接受回答我猜。 – 2013-02-07 19:35:41

+1

真棒破解^ H^H^H ^解析:) – DrMickeyLauer 2013-06-19 13:05:23

0

曾與狀態欄和視圖之間不必要的差距類似的問題直接below它,通過在界面生成器將autosizing並設置有問題的觀點堅持其父視圖頂部解決它。

16

奇怪的是,是什麼在iOS 6中幫助我的子類的UINavigationController和實施此方法:

- (BOOL)wantsFullScreenLayout { 
    return NO; 
} 

取消勾選「要全屏」在我的故事板沒有做的伎倆,所以我不知道知道有什麼不同。這在未來的iOS版本中肯定會崩潰。但現在,我會接受。

+1

是的,這真的很奇怪,當我在iOS 6中將導航控制器設置爲關鍵窗口的rootViewController時,即使設置爲NO,wantFullScreenLayout始終爲YES。這篇文章解決了我的問題,謝謝!但是在iOS 5中,它被設置爲NO後的值爲NO。這可能是蘋果的錯誤嗎? – Chengjiong 2012-11-29 06:45:28

+0

它工作正常,謝謝@Brent。 :-) – 2013-01-23 13:13:05

+0

謝謝你!奇怪的故事板.. – velkopopovizky 2013-04-18 13:18:59

0

在我看來,那是我把這個代碼viewDidAppear

內navigationcontroller內顯示該代碼可能不適合所有的應用,但它固定我的問題,我花了幾個小時在踢..

// START OF BUG FIX FOR iOS 
if (self.navigationController.navigationBar.frame.origin.y ==20) { 
    // Move the navigation Bar up 
    [self.navigationController.navigationBar setFrame:CGRectMake(0, 0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height)]; 
    // move up the table view 
    [self.view setFrame:CGRectMake(0, -20, self.view.frame.size.width, self.view.frame.size.height+20)]; 
} 
// END OF BUG FIX for IOS6 
3

要解決這個問題,只需勾選故事板上的Wants Full Screen

問題出現,因爲ParentViewController顯示導航欄。

蘋果文件說:

如果您的應用程序顯示在狀態欄,認爲縮小,使其不欠重疊的狀態欄。畢竟,如果狀態欄不透明,則無法查看或與其下面的內容交互。但是,如果您的應用顯示半透明狀態欄,則可以將視圖控制器的wantsFullScreenLayout屬性的值設置爲YES,以允許您的視圖全屏顯示。狀態欄繪製在視圖的頂部。

2

當我在viewDidLoad的ViewController中添加一個UITableView時遇到了同樣的問題。而是抓住從self.view的框架,我把它形成的主窗口,使其看起來像這樣

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window]; 
self.uiTable = [[UITableView alloc] initWithFrame:[keyWindow frame] style:UITableViewStylePlain]; 
相關問題