iOS 10 barTintColoranimation

我已经注意到在ios 10中色条animation颜色方式的变化。我已经创build了一个示例项目来概述变化: Github:ios10BarTintDemo

基本上在ios 9 barTintColor使用animation顺利使用[UIViewControllerTransitionCoordinator animateAlongsideTransition]

但在IOS 10的animation是不那么stream畅,当popup一个视图控制器根本没有animation,我已经尝试添加[self.navigationController.navigationBar layoutIfNeeded]在一些类似的答案中提到,但似乎并没有当推/popup控制器的任何影响。

UPDATE

我已经在iOS 10.3中testing过了,我认为这个问题已经解决了。 而transitionCordinator不再需要了。 我觉得animation很stream畅。 请检查我的项目在github或看看这个代码:

 class ViewControllerA: UIViewController { override func loadView() { super.loadView() title = "A" view.backgroundColor = .white navigationItem.rightBarButtonItem = UIBarButtonItem(title: "NEXT", style: .plain, target: self, action: #selector(self.showController)) } override func viewWillAppear(_ animated: Bool) { setColors() super.viewWillAppear(animated) } func showController() { navigationController?.pushViewController(ViewControllerB(), animated: true) } private func setColors() { navigationController?.navigationBar.tintColor = .black navigationController?.navigationBar.barTintColor = .red navigationController?.navigationBar.isTranslucent = false } } class ViewControllerB: UIViewController { override func loadView() { super.loadView() title = "B" view.backgroundColor = .white } override func viewWillAppear(_ animated: Bool) { setColors() super.viewWillAppear(animated) } override func willMove(toParentViewController parent: UIViewController?) { if parent == nil { navigationController?.navigationBar.barTintColor = .red } super.willMove(toParentViewController: parent) } private func setColors() { navigationController?.navigationBar.tintColor = .black navigationController?.navigationBar.barTintColor = .blue navigationController?.navigationBar.isTranslucent = false } } 

================================================== ================================================== ================================================== ================================================== ================================================== ==================================================

要实现这种animation,你应该使用UIViewControllerTransitionCoordinator正如苹果文档所说的那样:

采用UIViewControllerTransitionCoordinator协议的对象支持与视图控制器转换关联的animation(…)

所以每个UIViewController都有自己的transitionController 。 为了得到这个,你应该调用UIViewControllerClass

self.transitionCoordinator()

从文档 :

返回活动的过渡协调器对象。

所以要得到你想要的结果,你应该在viewController transitionCoordinatior中实现animateAlongsideTransition方法。 点击backButton并滑动返回时,animation将起作用。

例如:

navigation_bar_animation

第一控制器:

 class ViewControllerA: UIViewController { override func loadView() { super.loadView() title = "A" view.backgroundColor = .white navigationItem.rightBarButtonItem = UIBarButtonItem(title: "NEXT", style: .plain, target: self, action: #selector(self.showController)) setColors() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) animate() } func showController() { navigationController?.pushViewController(ViewControllerB(), animated: true) } private func animate() { guard let coordinator = self.transitionCoordinator else { return } coordinator.animate(alongsideTransition: { [weak self] context in self?.setColors() }, completion: nil) } private func setColors() { navigationController?.navigationBar.tintColor = .black navigationController?.navigationBar.barTintColor = .red } } 

第二控制器:

 class ViewControllerB : UIViewController { override func loadView() { super.loadView() title = "B" view.backgroundColor = .white setColors() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) animate() } override func willMove(toParentViewController parent: UIViewController?) { // tricky part in iOS 10 navigationController?.navigationBar.barTintColor = .red //previous color super.willMove(toParentViewController: parent) } override func viewDidAppear(_ animated: Bool) { navigationController?.navigationBar.barTintColor = .blue } private func animate() { guard let coordinator = self.transitionCoordinator else { return } coordinator.animate(alongsideTransition: { [weak self] context in self?.setColors() }, completion: nil) } private func setColors(){ navigationController?.navigationBar.tintColor = .black navigationController?.navigationBar.barTintColor = .blue } } 

更新iOS 10

在iOS 10中,棘手的部分是在第二个 ViewController中添加willMoveTo(parentViewController parent: UIViewController?) 。 并将navigationBar tintColor设置为前一个控制器的颜色值。 另外,在第二个 ViewControler的viewDidAppear方法中,将navigationBar.tintColor设置为第二个 viewController的颜色。

看看我的github上的示例项目

你可以通过添加类似的东西来解决这个popup的问题,在viewWillDisappear中运行它将不会在iOS10中出于某种原因

 override func willMove(toParentViewController parent: UIViewController?) { self.navigationController?.navigationBar.barTintColor = UIColor.red super.willMove(toParentViewController: parent) }