NavigationBar延迟更新barTintColor iOS10

语境:

假设我们有一个NavigationController和2个viewControllers。 ViewControllerA有一个蓝色的导航ViewControllerB ,而ViewControllerB有一个绿色的。

我把它们设置成这样:

 override func viewWillAppear(_ animated: Bool) { self.navigationController?.navigationBar.barTintColor = UIColor.blue // Green if ViewController B } 

当我从A到B时运行良好,但是当我返回时,navigationBar teint被更新。 就好像它是在viewDidAppear设置的。

预期:

导航栏的导航栏颜色应该没有延迟地更新。

解决scheme尝试

  • 我见过这个post,我试过解决scheme。 它的工作,但会导致导航栏的pipe理更加复杂和痛苦。 (在一个真正的应用程序)

  • 我试图改变ViewWillDisappear方法中的navbar teint。 没有工作。

更多:

这是由ios10 API的变化引起的。 我已阅读发行说明 ,但在这种情况下应该做什么还不清楚。

在iOS 10中,UIKit更新和统一了UINavigationBar,UITabBar和UIToolbar的后台pipe理。 尤其是,对这些视图的背景属性(如背景或阴影图像,或设置条forms)的更改可能会启动条形图的布局传递以parsing新的背景外观。

尤其是,这意味着尝试在layoutSubviews, – [UIView updateConstraints],viewWillLayoutSubviews,viewDidLayoutSubviews,updateViewConstraints或响应布局调用的任何其他方法内部更改这些条的背景外观可能会导致布局循环。

在某些情况下,您可以通过确保在需要对象(如UIImage或UIColor)时总是使用相同的对象实例来打破这些布局循环。 但总的来说,你应该避免这样做。

题:

在iOS 10中处理不同导航控制器之间导航栏变化的最好方法是什么?

试试这个代码:

注意:代码testing在Swift 3。

在ViewController A:

  override var isViewLoaded: Bool { title = "View 1" navigationController?.navigationBar.barTintColor = .blue navigationController?.navigationBar.isTranslucent = true navigationController?.navigationBar.tintColor = UIColor.white navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white] UIApplication.shared.statusBarStyle = .lightContent self.navigationController?.navigationBar.barStyle = .black // In case statusbar Light content wont work. return true } 

在ViewController B中:

  override var isViewLoaded: Bool { title = "View 2" navigationController?.navigationBar.barTintColor = .green navigationController?.navigationBar.tintColor = .white navigationController?.navigationBar.isTranslucent = true navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white] return true } 

输出:没有延迟,所以…

在这里输入图像描述

作为TintColor的图案图像。

在ViewController A:

  navigationController?.navigationBar.barTintColor = UIColor(patternImage: UIImage(named: "viewOneImage.jpg")!) 

在ViewController B中:

  navigationController?.navigationBar.barTintColor = UIColor(patternImage: UIImage(named: "viewTwoImage.jpg")!) 

输出:

在这里输入图像描述