1. 程式人生 > >UINavigationController使用時,顯示或隱藏的功能裝置,導航欄隱藏時出現空白黑色區域?

UINavigationController使用時,顯示或隱藏的功能裝置,導航欄隱藏時出現空白黑色區域?

UINavigationController使用時,導航欄隱藏時出現空白黑色區域時,應該如何解決?

情況1:檢視控制器A導航欄隱藏,檢視控制器B導航欄顯示,當 A push 到 B 時,再由 B pop 回到 A 時,會出現與導航欄等高的黑色區域。

情況2:檢視控制器A導航欄隱藏,檢視控制器B導航欄顯示,當 A present 到 B 時,再由 B dismiss 回到 A 時,會出現與導航欄等高的黑色區域,且同時會伴有跳動情況。

首先需要明白的是,隱藏導航欄共有4種方法,使用方法3,且animated必須設定為YES,則可以避免出出空白黑色區域。

方法1 

[self.navigationController.navigationBar setHidden:YES];

方法2 

[self.navigationController setNavigationBarHidden:YES];

方法3 (結合檢視控制器即將顯示,即將隱藏的方法使用,可以有效解決情況1 的問題)

[self.navigationController setNavigationBarHidden:YES animated:YES];

除了解決黑色區域顯示問題,還需要考慮到 A 顯示時不會出現抖動的情況(即 A 檢視顯示時,先出現與狀態列等高的黑色區域,然後再向上移動),程式碼參考如下:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    // 1 B pop 回到 A 時,不會出現黑色區域,但可能會出現抖動情況
//    [self.navigationController setNavigationBarHidden:YES animated:YES];
    
    // 2 B pop 回到 A 時,會出現黑色區域,但不會出現抖動情況
//    [self.navigationController setNavigationBarHidden:YES animated:NO];
    
    // 3 B pop 回到 A 時,不會出現黑色區域,也不會出現抖動情況
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

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

方法4(可以有效解決情況2 的問題)

// 設定代理 注意新增協議UINavigationControllerDelegate
self.navigationController.delegate = self;  
  
#pragma mark UINavigationControllerDelegate  
  
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated  
{  
    if ([viewController isEqual:self])  
    {  
        [self.navigationController setNavigationBarHidden:YES animated:YES];  
    }  
    else  
    {  
        [self.navigationController setNavigationBarHidden:NO animated:YES];  
    }  
}  

使用方法4進行隱藏或顯示導航欄檢視控制器時,有可能出現另外一種情況,即由導航欄檢視控制器A push後的另一個導航欄檢視控制器B也是設定了導航欄控制器的隱藏或顯示,再由B返回A時,可能會造成A的異常,造成這種情況的原因在於A的代理改變了,只需要重置一下就可以解決該問題。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (self.navigationController.delegate != self)
    {
        self.navigationController.delegate = self;
    }
}



注意事項

1、使用非代理方法隱藏,或顯示導航欄時,push出新的檢視控制器時可能會出現導航欄大小的黑色區域,這時候需要新增動畫效果,即設定為YES;同時該方法通常在檢視控制器即將消失,或顯示的方法中實現;

2、使用非代理方法隱藏,或顯示導航欄時,present新的檢視控制器時可能會出現導航欄大小的黑色區域,同時會出現跳動的情況,這時候應該使用代理方法來設定隱藏,或顯示導航欄,同時遮蔽動畫效果,即設定成NO。