J'ai cherché à savoir comment faire la transition/animer les barTintColor
d'un UINavigationBar
depuis un moment maintenant, et je ne vois que des réponses différentes. Certains utilisent UIView.animateWithDuration
quelques utilisations CATransition
mais les plus intéressants, comme celui-ci utiliser animate(alongsideTransition animation..
J'aime bien le son, mais je n'arrive pas à le faire fonctionner correctement. Est-ce que je fais quelque chose de mal ?
Beaucoup précisent que je peux simplement utiliser le transitionCoordinator
sur viewWillAppear:
. J'ai mis en place un nouveau super petit projet comme celui-ci :
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
}
}
Avec ce code, cela se produit :
- La poussée-transition de
First
àSecond
semble parfait. Tous les éléments effectuent une transition parfaite, sauf peut-être la barre d'état, qui devient instantanément blanche. Je préférerais savoir comment effectuer la transition, mais je l'accepte pour l'instant. - La transition pop de
Second
àFirst
est complètement faux. Ça empêche les couleurs deSecond
jusqu'à ce que la transition soit complètement terminée. - La transition de la traînée de
Second
àFirst
a l'air bien, quand on le fait glisser jusqu'en haut. Encore une fois, la barre d'état devient instantanément noire dès que je commence à glisser, mais je ne sais pas si cela peut être corrigé. - La transition de la traînée de
Second
àFirst
mais annulé à mi-chemin et retourné àSecond
est complètement foutu. Ça a l'air bien jusqu'à ce queSecond
a repris le contrôle, puis se transforme soudainement enFirst
-couleurs. Cela ne devrait pas se produire.
J'ai fait quelques changements dans mon RootViewController
pour le rendre un peu meilleur. J'ai enlevé viewWillAppear:
complètement, et l'a changé avec ceci :
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
}
}
Avec ce code mis à jour, j'obtiens ceci :
Quelques observations :
- Le passage de
First
àSecond
est le même - La transition pop de
Second
àFirst
s'anime maintenant correctement, à l'exception de la flèche arrière, du texte arrière (et de la barre d'état, mais oui ). Ceux-ci sont instantanément changés en noir. Dans le premier gif, vous pouvez voir que la flèche arrière et le texte arrière ont également fait la transition. - La transition de la traînée de
Second
àFirst
a également ce problème, la flèche arrière et le texte arrière sont soudainement noirs au démarrage. La teinte de la barre a été corrigée afin qu'elle n'obtienne pas la mauvaise couleur lors de l'annulation du déplacement.
Qu'est-ce que je fais de mal ? Comment dois-je m'y prendre ?
Ce que je veux, c'est une transition en douceur de tous les éléments. La teinte du bouton arrière, le texte arrière, le titre, la teinte de la barre et la barre d'état. Cela n'est-il pas possible ?
0 votes
Cela fait des mois que je cherche une solution à ce problème.
0 votes
@mxcl stackoverflow.com/a/46929155/1336510