隐藏导航栏无非就是两个API (参考 - https://blog.csdn.net/ws1352864983/article/details/51932388)
第一种
第二种
如果A,C - 隐藏导航栏 B,D - 显示导航栏
A push B push C 或者 B push C push D 以上两个方法都可以满足
但是如果 是 A push C push B 的话,
1. A与C 的push过程
2.C pop 回A
3.C 侧滑回A
这三种情况,导航栏都是有闪现的情况
因为需求问题,一直迟迟未解决,也不想因为导航栏的问题,集成个第三方,就自发研究一下
如果解决两个隐藏控制器显示或者隐藏的时候,可以确保没问题呢?
关键代码是 - navigation.alpha 这个属性,可以让你不想看见的导航栏彻底隐藏
举例,A和C控制器导航栏都应该是隐藏的,在控制器声明一个属性 - 默认为NO
隐藏的控制器AC 在viewDidLoad写这样的方法
隐藏的控制器AC 在willAppear写这样的方法
在DidAppear
当隐藏A push 到C的时候
添加这个代码,这个方法的好处是改的少,只要找特定两个都是隐藏的控制器跳转的情况下将隐藏属性赋值,就可以解决.
至于demo代码,如果有人看不懂,或者实现有问题,可以留言,我可以写一下demo,但因为本简书长期无人问津,我就暂时不弄了,以笔记的方法记录一下自己的研究
个人认为的原理,可能和真实会有点偏差
1. 一个NavigationViewControler 里面怎么push,怎么pop 用的都是同一个navgationBar
2. 控制器A push B 在生命周期某一个苹果私有方法中,会把导航栏显示出来, 所以A(隐藏) push B(显示)的时候,B无须对导航栏作任何处理,同时 A(隐藏) push B(隐藏),无论你在viewDidLoad ,viewWillAppear,viewDidAppear,viewWillDisappear,viewDidDisappear 这几个方法怎么设置self.navigationController.navigationBar.hidden,控制器的导航栏在过程中还是会显示,真正让导航栏隐藏只能使用alpha
3.在didAppear的方法中将alpha设置为1是因为如果你不这样做,会导致 A(隐藏) push B(显示),B的导航栏也会显示,如果你的项目有的控制器显示导航栏,有的隐藏,而显示的居多,而隐藏push隐藏是后来的需求,你的改动量就会无比的大
4.A控制器 viewWillAppear 调用时机不仅是A被push的时候,也包括 A被侧滑,或pop回来,所以 A push B的时候 将isPushHideViewController 赋值为yes的时候,主要是为了 A被侧滑,或pop回来的时候仍保持隐藏导航栏
希望能帮助到大家~
网友评论