问题描述
相信很多朋友遇到过需要隐藏导航栏的需求。然后问题就来了,这个隐藏了导航栏的视图控制器在跳转到另一个没有隐藏导航栏的视图控制器时(或者跳转到一个也隐藏了导航栏的视图控制时),push动画会导致UINavigationBar在切换时出现或隐藏,导致切换过程中NavigationBar时隐时现的问题。
问题分析
出现这个问题,可以确定的是,隐藏UINavigationBar导致的。可是为什么我隐藏了UINavigationBar后,在切换时又出现了呢?其实这个问题,是因为隐藏不彻底导致的,估计朋友们隐藏都是这样做的:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated)
}
可是系统的UINavigationBar默认是显示的,所以当第一个视图控制器消失时,UINavigationBar可能还会出现在转场动画中。
问题解决
既然这个视图控制器不需要显示UINavigationBar,那就彻底隐藏UINavigationBar吧:
下面以VC1(隐藏UINavigationBar)push到VC2(不隐藏UINavigationBar;或者也隐藏UINavigationBar)为例:
在vc1中实现以下代码
// 即将显示时,隐藏UINavigationBar
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated)
}
// 即将消失时,也要隐藏UINavigationBar
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated)
}
在vc2(这里不隐藏UINavigationBar)中实现以下代码:
// 即将显示时,显示UINavigationBar
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated)
}
// 即将消失时,也要显示UINavigationBar
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated)
}
最后,需要提醒大家一下,如果大家在项目里如果有一个viewController的基类(比如:XXBaseViewController),这个XXBaseViewController里就不要实现上面两个方法里的逻辑了,不然,push转场时还会出现错乱的问题(究其原因,是因为push时,会先调用XXBaseViewController的viewWillAppear和viewWillDisappear方法,然后又调用一遍子类的viewWillAppear 和viewWillDisappear方法,如果基类和子类的这两个方法实现的逻辑不一样,自然就会导致动画错乱的问题)。我就是在这个问题上被纠缠了一两天才明白过来的。希望大家不要再犯同样的错。