UINavigationController 仅隐藏导航栏 - 后退动画问题

Posted

技术标签:

【中文标题】UINavigationController 仅隐藏导航栏 - 后退动画问题【英文标题】:UINavigationController hide only navigationBar - Back animation issue 【发布时间】:2017-10-06 10:15:00 【问题描述】:

我在UINavigationController 中有三个视图控制器。在第二个中,我需要隐藏导航栏而不是后退按钮和其他栏按钮。因此我不能使用isNavigationBarHidden = true 目前我正在按以下方式处理上述问题:

第一个视图控制器:

override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.barTintColor = Constants.kThemeRedColor
        self.navigationController?.navigationBar.tintColor = UIColor.white
        self.navigationController?.navigationBar.barStyle = .black
        self.navigationController?.navigationBar.isTranslucent = false
    

第二个viewController(只隐藏导航栏):

override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.view.backgroundColor = UIColor.clear
     

这里的问题是,当我在 firstViewController 之间导航时,在很短的时间内,当第一个 viewController 分别消失和出现时,我会看到一个黑色的导航栏。我知道这是因为用 2nd viewController 编写的代码。但我没有任何其他解决方案可以做到这一点。附上截图:

第一个 viewController(应该是怎样的):

第二个视图控制器:

第一个 viewController(带有短暂的黑色导航栏):

【问题讨论】:

您的免费视图颜色是什么?导航栏下方是表格视图吗? 【参考方案1】:

First viewController中,同样将navigationBarbackgroundImageshadowImage设置为nil,即

class FirstVC: UIViewController

    override func viewWillAppear(_ animated: Bool)
    
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
        self.navigationController?.navigationBar.shadowImage = nil
        self.navigationController?.navigationBar.barTintColor = .red
        self.navigationController?.navigationBar.tintColor = UIColor.white
        self.navigationController?.navigationBar.barStyle = .black
    


class SecondVC: UIViewController

    override func viewWillAppear(_ animated: Bool)
    
        super.viewWillAppear(animated)

        self.navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        self.navigationController?.view.backgroundColor = UIColor.clear
        self.navigationController?.navigationBar.shadowImage = UIImage()
    

【讨论】:

效果很好。谢谢。我还需要问,从 VC1 到 VC2 时,同样的事情也会发生。在很短的时间内,VC1 的导航栏在导航到 VC2 时变黑。我该如何解决这个问题? 也能正常工作。解决方案:在VC2中,设置:self.navigationController?.view.backgroundColor = Constants.kThemeRedColor【参考方案2】:

您应该隐藏导航控制器的导航栏并使用 UIView 使用自定义导航栏。我想它会解决你的问题。

【讨论】:

【参考方案3】:

第一个 viewController 在快速转换时会在短时间内显示黑色导航栏,因为发生导航栏转换的 UIWindow 的背景颜色。简单地说,在您的 didFinishLaunchingWithOptions: AppDelegate 方法中添加这一行

window?.backgroundColor = Constants.kThemeRedColor

你就完成了。编码愉快!

【讨论】:

以上是关于UINavigationController 仅隐藏导航栏 - 后退动画问题的主要内容,如果未能解决你的问题,请参考以下文章

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr

从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)

UINavigationController