【发布时间】:2017-08-18 06:57:39
【问题描述】:
我一直在寻找如何转换/动画UINavigationBar 的barTintColor 一段时间,但我只看到不同的答案。有些使用UIView.animateWithDuration,有些使用CATransition,但最有趣的,比如this one 使用animate(alongsideTransition animation..,我喜欢它的声音,但我无法让它正常工作。我是不是做错了什么?
许多人指定我可以在viewWillAppear: 中简单地使用transitionCoordinator。我已经建立了一个新的超级小项目,如下所示:
class RootViewController:UIViewController{ //Only subclassed
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
transitionCoordinator?.animate(alongsideTransition: { [weak self](context) in
self?.setNavigationColors()
}, completion: nil)
}
func setNavigationColors(){
//Override in subclasses
}
}
class FirstViewController: RootViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "First"
}
override func setNavigationColors(){
navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.tintColor = UIColor.black
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.black]
navigationController?.navigationBar.barStyle = UIBarStyle.default
}
}
class SecondViewController: RootViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Second"
}
override func setNavigationColors(){
navigationController?.navigationBar.barTintColor = UIColor.black
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
navigationController?.navigationBar.barStyle = UIBarStyle.black
}
}
- 从
First到Second的推送转换看起来很完美。所有元素都完美过渡,可能除了状态栏,它会立即变为白色。我更想知道如何转换它,但我现在会接受它。 - 从
Second到First的pop-transition 是完全错误的。它会保留Second的颜色,直到过渡完成。 - 从
Second到First的拖动过渡看起来不错,当一直拖动时。同样,当我开始拖动时,状态栏会立即变黑,但我不知道这是否可以解决。 - 从
Second到First的拖动转换但取消了中间拖动并返回到Second完全搞砸了。在Second完全恢复控制之前它看起来很好,然后它突然将自身变为First-colors。这不应该发生。
我对我的RootViewController 做了一些更改,让它变得更好一些。我完全删除了viewWillAppear:,并用这个进行了更改:
class RootViewController:UIViewController{
override func willMove(toParentViewController parent: UIViewController?) {
if let last = self.navigationController?.viewControllers.last as? RootViewController{
if last == self && self.navigationController!.viewControllers.count > 1{
if let parent = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - 2] as? RootViewController{
parent.setNavigationColors()
}
}
}
}
override func viewWillDisappear(_ animated: Bool) {
if let parent = navigationController?.viewControllers.last as? RootViewController{
parent.animateNavigationColors()
}
}
override func viewDidAppear(_ animated: Bool) {
self.setNavigationColors()
}
func animateNavigationColors(){
transitionCoordinator?.animate(alongsideTransition: { [weak self](context) in
self?.setNavigationColors()
}, completion: nil)
}
func setNavigationColors(){
//Override in subclasses
}
}
一些观察:
- 从
First到Second的转换是一样的 - 从
Second到First的pop-transition 现在可以正确动画了,除了后退箭头、后退文本(和状态栏,但是是的..)。这些立即变为黑色。在第一个 gif 中,您可以看到后退箭头和后退文本也发生了过渡。 - 从
Second到First的拖动过渡也有这个问题,启动时后退箭头和后退文字突然瞬间变黑。 barTint 已修复,因此在取消拖动时不会出现错误的颜色。
我做错了什么?我该怎么做?
我想要的是平滑过渡所有元素。后退按钮、后退文本、标题、barTint 和状态栏的色调。这不可能吗?
【问题讨论】:
-
几个月来我一直在寻找解决方案。
标签: ios uiview uiviewcontroller