iOS 11下UINavigationBar颜色与透明切换bug(大标题场景)
解决iOS 11大标题模式下导航栏pop后样式不恢复的问题
我完全懂你踩的这个坑!iOS 11刚推出大标题(largeTitles)特性时,导航栏的样式切换确实存在不少奇怪的状态同步bug,尤其是push/pop过程中在透明和实色样式之间来回切换的场景,跟你描述的情况一模一样。
问题本质
当你push到下一个ViewController时,把导航栏改成透明样式能正常生效,但pop回原页面后,哪怕你把isTranslucent设回false、barTintColor重新设为红色,导航栏还是会停留在透明状态——这是因为iOS 11的大标题模式下,导航栏的布局逻辑和普通模式不同,样式属性变更后系统并没有自动触发UI重绘,导致新的样式没有被正确渲染。
解决方案(按@Menoor Ranpura的建议)
在你恢复红色导航栏样式的代码后面,加上一行强制导航栏更新布局的代码,就能解决这个问题。
比如在原页面的viewWillAppear方法里这样处理:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 恢复导航栏的红色非透明样式 navigationController?.navigationBar.prefersLargeTitles = true navigationController?.navigationBar.isTranslucent = false navigationController?.navigationBar.barTintColor = .red // 关键:强制导航栏重新布局,触发样式渲染 navigationController?.navigationBar.setNeedsLayout() }
如果是通过导航控制器代理方法(比如navigationController(_:willShow:animated:))来统一处理样式切换,同样在设置完样式后加上navigationController?.navigationBar.setNeedsLayout()即可。
为什么这行代码有用?
setNeedsLayout()会告诉系统导航栏的布局需要重新计算,这会强制触发导航栏的UI重绘,让你设置的红色非透明样式能够正确显示出来,而不是停留在之前的透明状态。
内容的提问来源于stack exchange,提问作者kamwysoc
相关产品推荐
相关产品推荐

