语境:
假设我们有一个NavigationController和两个viewControllers.
ViewControllerA有一个蓝色导航栏,而ViewControllerB有一个绿色导航栏.
我这样设置它们:
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.navigationBar.barTintColor = UIColor.blue // Green if ViewController B
}
Run Code Online (Sandbox Code Playgroud)
当我从A到B时,它运行良好,但是当我返回时,navigationBar teint会在之后更新.就好像它是在它中设置的一样viewDidAppear.
预期:
导航栏应该立即更新其导航栏颜色.
解决方案:
我已经看过这个SO帖子了,我尝试了解决方案.它有效,但会使导航栏的管理变得更加复杂和痛苦.(在真实的应用程序中)
我试图改变方法中的navbar teint ViewWillDisappear.没工作.
更多:
这是由ios10 API的更改引起的.我已经阅读了发行说明,但目前还不清楚在这种情况下应该做些什么.
在iOS 10中,UIKit为UINavigationBar,UITabBar和UIToolbar更新并统一了后台管理.特别是,对这些视图的背景属性(例如背景或阴影图像或设置条形样式)的更改可能会启动条形图的布局传递以解析新的背景外观.
特别是,这意味着尝试在layoutSubviews, - [UIView updateConstraints],viewWillLayoutSubviews,viewDidLayoutSubviews,updateViewConstraints或响应布局调用的任何其他方法中更改这些条的背景外观可能会导致布局循环.
在某些情况下,您可以通过确保在需要对象(例如UIImage或UIColor)时始终使用相同的对象实例来中断这些布局循环.但总的来说,你应该避免这样做.
题:
处理iOS 10中不同导航控制器之间导航栏更改的最佳方法是什么?