在UINavigationController堆栈中仅隐藏一个UIViewController的导航和状态栏

时间:2017-01-29 15:47:27

标签: ios swift uinavigationcontroller uinavigationbar uistoryboardsegue

我希望我在导航控制器堆栈中推送的一个viewControllers为“全屏” - 没有导航栏,也没有状态栏。 我有这个代码隐藏并显示导航控制器的一个视图控制器中的导航栏(我希望它在全屏幕上推送):

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated:animated)   
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated:animated) 
}

在同一个viewController中,我还隐藏了状态栏:

override var prefersStatusBarHidden: Bool {
    return true
}

隐藏并按预期显示,但问题是当推动此视图控制器并从其返回时,我在转换上出现黑色条纹(参见图像)。

推送到此控制器: Push to this controller

从此控制器返回(后退按钮):

Back from this controller

看来这种情况正在发生,因为prefersStatusBarHidden函数删除它解决了这个问题。

显示/隐藏导航栏的代码取自: https://stackoverflow.com/a/2406167/4207465

基于apple开发者库: “显示和隐藏导航栏 - 当导航栏与导航控制器一起使用时,您总是使用UINavigationController的setNavigationBarHidden:animated:方法来显示和隐藏导航栏......“

不确定为什么会这样, 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

@Boaz Frenkel

在隐藏和显示带有或不带状态栏的导航栏时,有一种解决方法可以修复黑条。

ViewController A:全屏视图

override func viewWillAppear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewDidAppear(animated: Bool) {
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)
    super.viewDidAppear(animated)
}

ViewController B:使用NavigationBar和状态栏

override func viewWillAppear(animated: Bool) {

    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None)
    super.viewWillAppear(animated)
}

答案 1 :(得分:0)

请尝试隐藏viewDidAppear中的导航栏。现在你在显示控制器之前隐藏吧。

func viewDidAppear(_ animated: Bool) {
    super. viewDidAppear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated:    animated)
}