2009-11-05 61 views
2

互動我有我要佔滿整個屏幕,所以我重載init方法的視圖,以及一些觀點方法:如何presentModalViewController嵌套的UITabBarController和UINavigationController的

- (id) init { 
    if (self = [super init]) { 
    self.wantsFullScreenLayout = YES; 
    } 
    return self; 
} 
- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
} 
- (void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; 
} 

現在,從另一個屏幕,我想將其顯示爲模式視圖:

UIViewController *screen = [[MyScreen alloc] init]; 
[self presentModalViewController:screen]; 
[screen release]; 

所有漂亮的標準東西。但是,當我想讓全屏視圖消失時,先前的視圖會移動或拉伸大約40個像素。

特別是,我有一個UITabBarControllerUINavigationController裏面,顯示一個UITableViewController,這是顯示子視圖的視圖,也是上移的視圖。如果表格不在導航控制器中,則一切正常,沒有任何東西會被移動。如果我嘗試註釋掉沒有導航欄的wantsFullScreenLayout和setStatusBarHidden行,它有時會向上移動20個像素,或者實際上不會在全屏幕上顯示(但後來它不會更改任何代碼),或者有時不會打破所有(但我沒有得到全屏與任何這些)

我做錯了什麼?

+0

您能否在您介紹modalview之前和之後向我們展示代碼?我曾經遇到過這個問題,並且記住,解決方案與 – 2009-11-05 20:14:31

+0

中發生的訂單有關。在顯示模態視圖之前或之後確實沒有代碼。用戶點擊表格視圖中的單元格,顯示視圖,就是這樣。上面顯示的代碼基本上是整個函數sans方法簽名。 – 2009-11-05 20:23:10

+0

也有任何非標準繪圖發生?像OpenFeint庫或其他圖書館一樣畫在屏幕上? – 2009-11-05 20:23:30

回答

2

通過肖恩的建議,並跳起來響應鏈的組合,我發現,工作原理是什麼,似乎像所有的情況下(迄今爲止)的解決方案。

第一個問題: 表視圖本身並不顯示在導航控制器中,但如果從標籤欄的更多視圖中選擇,則可能會顯示在一箇中,並且這種情況下全部顯示模式視圖屏幕會導致表返回時導航欄的下方。

第二期: 未顯示在導航控制器中時,呈現模態視圖並不佔用全屏(儘管wantsFullScreenLayout設置爲YES)。從此視圖返回時,視圖向上移動20個像素,您可以看到表格底部和標籤欄頂部之間存在間隙。

解決方案:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:NO]; 
    [self.navigationController setNavigationBarHidden:NO animated:NO]; 
} 

- (void) presentModalViewController:(UIViewController *)screen animated:(BOOL)animated { 
    UIResponder *responder = self; 
    while (responder && ![responder isKindOfClass:[UITabBarController class]]) { 
    responder = [responder nextResponder]; 
    } 
    [(UIViewController *)responder presentModalViewController:screen animated:YES]; 
} 

導航欄的可見性的撥動強制重新佈局。重寫presentModalViewController實際上調用了標籤欄控制器上的presentModalViewController,而這會導致它顯示在全屏中。出於某種原因,self.tabBarController不在更多的視圖控制器中,所以我不得不跳過響應者鏈來找到它。

+0

我有一個類似的問題,當一個表格視圖向下移動但沒有彈起時,通過點擊取消按鈕隱藏搜索欄上的範圍按鈕。解決方案在於適當的視圖嵌套。只要搜索欄是表視圖控制器的子項,視圖層次結構就會自行處理移位和重繪。 – 2010-12-23 19:46:57

0

我覺得這與presentModalViewController的時間做的事:打電話。作爲測試,您可以在調用該方法之前嘗試添加睡眠(3)。如果這可以解決任何問題,或者即使它不我想我會嘗試移動周圍事物的順序。也許viewDidDisappear和viewDidAppear而不是「會不會」

1

你的UINavigationController將得到的模態視圖駁回之前調用與viewWillAppear中。您是否嘗試過在控制器中調用[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];,這些控制器可在模式解除後顯示。當界限發生變化時,我遇到了大量在UINavigationControllers之上顯示模態視圖的問題。它對抗任何佈局變化,並需要大量重置到以前的狀態,以使其行爲良好。也可以撥打[self.navigationController setNavigationBarHidden:NO animated:NO]以強制佈局。

如果這工作得很好,可能爲您創建一個簡單的基類,設置這些在它的viewWillAppear中,然後只要繼承它的所有非模態視圖控制器。

如果這不起作用,你可以嘗試把一個交換看法,它包含標籤欄控制器的頂層,那麼你可以當你出示模式的看法與過渡去掉標籤欄控制器。是的,這在技術上不是模態,但仍然看起來不錯,並提供相同的效果。那時候,由於視圖控制器不在視圖層次結構中,所以它不應該得到它的佈局。

相關問題