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")!)
输出:
- iOS 10中的错误:无法从https://mesu.apple.com/assets/中复制资产types的资产信息
- xcode 8推送通知function和授权文件设置
- Xcode 8 | iOS 10模拟器“回复错误:连接无效”
- 即使在应用程序ID中启用了推送通知后,为什么“向您的应用程序ID添加推送通知function”警告?
- 禁用视口缩放iOS 10+的Safari浏览器?
- 由于Xcode 8和iOS10,视图在viewDidLayoutSubviews上的大小不正确
- Xcode 8 iOS 10不间断设备日志
- iOS 10 / Xcode 8中的设备NSLog似乎截断? 为什么?
- 推送通知问题与iOS 10