NavigationBar 的 奇幻 BUG 之旅
前两天, 在把玩自家 App 应用的时候,发现了导航栏的一些过渡动画小瑕疵,虽然不影响大局使用,但对于我这种 ‘伪强迫症患者’ 简直就是不能忍受,经过两天的闲暇时间加班研究,终于使导航栏的动画效果变得舒服完美,心里顿时就美滋滋啦,避免小伙伴们跟我一样走入误区, 就写篇文章大家一起讨论讨论~
NavigationBar 怎么使用的我就不说了,很简单而且Google 中有大把教程,我主要就说下我遇到的几个问题,闲话少说了,我就直接上图
第一个问题.gif
第一个问题很简单,只不过是设置 navgationBar 的隐藏属性时没有设置 动画效果, 修改成 true 即可
navigationController?.navigationBar.isHidden = true
navigationController?.isNavigationBarHidden = true
navigationController?.setNavigationBarHidden(true, animated: false)
不管用上面三种哪个方法都修改为 :
navigationController?.setNavigationBarHidden(true, animated: animated)
第二个问题.gif
第一个问题解决了, 第二个问题就有点难了, 在项目中右划返回到一半时迅速撤回会使 navgationBar 丢失,但是缓慢撤回并不会影响到 NavgationBar. 这个问题困扰了我挺长时间的,因为并不知道是哪里出了问题, 只能使用排除法.
首先呢我想到了是不是因为基类的缘故,在项目中我是利用判断来进行 bar 的隐藏的,会不会是因为先前的动画效果没有执行完毕,撤回的太快就没有执行显示的方法,所以我就先将两个页面拆解出来,然而发现并没有卵用.所以那就不是这方面的问题了,
然后,我猜想是不是执行代码的逻辑顺序有问题,我就调整了一下代码的执行顺序,发现也并没有什么卵用..我就懵逼了,真的是没法想出来了,各种求救也是无果.
真是车到山前必有路,在一个偶然的情况下, 我删除了执行 状态栏样式的方法
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
竟然神奇一般的好了, 不管怎么样毕竟问题已经找到了, 那就开始着手解决吧,这个方法使用不通,那我们使用属性修改吧, 但是修改属性也不行,因为 StatusBarStyle 的属性是 get-only 的, 只能读取,没有修改的权限.
既然修改不了当前页面的 StatusBar 那就只能修改系统的 StatusBar 了, 在有关页面的 viewWillAppear 方法中都写上修改方法
UIApplication.shared.statusBarStyle = .default
对了,利用这个属性设置的 StatusBarStyle 的话, 需要在info.plist文件中添加一个属性行,选中表空白地方,右键选中Add Row, 然后在列表中选中最后一个选项,也就是View controller-based status bar appearance,设置为No(不支持在文件中设置状态栏样式),然后在AppDelegate中写上UIApplication.shared.statusBarStyle = .LightContent,这样的话,全局的状态栏样式就OK了。其他的界面如果想要改变样式的话,直接用
UIApplication.shared.statusBarStyle = .default 修改就可以了。
虽然这个方法使用起来是可以解决问题的,但是这个问题为什么出现我暂时还没想通,如果有哪位好汉知道该问题的原理,不要吝啬~敬请赐教哈!