web-dev-qa-db-fra.com

Comment animer la propriété textColor d'un UILabel?

Pour une raison quelconque, lorsque j'essaie d'animer textColor, cela ne fonctionnera pas. Le textColor change soudainement de A à B. Est-il possible de l'animer, du rouge au noir?

67
dontWatchMyProfile

La propriété textColour n'est pas spécifiée comme pouvant être animée dans la documentation. Je ne pense donc pas que vous puissiez le faire avec un simple bloc d'animations UIView ...

Cela pourrait probablement être fait assez grossièrement avec un tir NSTimer toutes les deux millisecondes, chaque fois en réglant la couleur progressivement de l’une à l’autre.

Je dis que c'est brutal car il faudrait un tableau ou un autre conteneur de valeurs de couleurs prédéfinies allant de la couleur de départ à la couleur de finition, et je suis sûr qu'il est possible de le faire en utilisant une animation principale 'sais pas ce que c'est.

5
Jasarien

Au lieu de cela, avez-vous essayé d’utiliser une transition de fondu enchaîné sur l’objet lui-même, cela vous donnera un effet de fondu enchaîné sympa d’une couleur à l’autre:

[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];

C'est mieux que d'utiliser NSTimers, CATextLayers et ainsi de suite pour différentes raisons. CATextLayer ne prend pas correctement en charge le crénage de texte ou NSAttributedText, et les NSTimers sont lents (en plus, il y a trop de code). L'animation de transition ci-dessus fait l'affaire, et peut également être utilisée dans une animation en chaîne. J'ai eu le même problème et j'ai déjà essayé les solutions ci-dessus, mais ce code simple fonctionne à merveille à la place.

155
strange

Swift 4 solution:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)
44
budidino

La raison pour laquelle textColor n'est pas animable est qu'UILabel utilise un CALayer standard au lieu d'un CATextLayer. 

Pour rendre textColor animable (ainsi que le texte, la police de caractères, etc.), nous pouvons sous-classer UILabel pour qu’il utilise un CATextLayer.

C'est beaucoup de travail, mais heureusement je l'ai déjà fait :-)

Vous pouvez trouver une explication complète + un remplacement open-source instantané pour UILabel dans cet article article

12
adamsiton

Vous pouvez essayer de créer une autre instance de UILabel ou quoi que ce soit qui contient textColor, puis appliquer l'animation entre ces deux instances (avec l'ancien textColor et celle avec le nouveau textColor).

9
benasher44

Voici mon code pour animer la couleur du texte de l'étiquette. Le partie importante est de définir textColor sur clearColor avant animation

label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
5
servalex

C'était la seule chose qui a fonctionné pour moi: 

let changeColor = CATransition()
changeColor.duration = 1

CATransaction.begin()

CATransaction.setCompletionBlock {
    selected.label.layer.addAnimation(changeColor, forKey: nil)
    selected.label.textColor = .blackColor()
}

selected.nameLabel.textColor = .redColor()

CATransaction.commit()
1
shokaveli

J'ai trouvé assez facile de placer UIView sous l'étiquette et d'animer son opacité. L’étiquette doit être ajoutée à cette vue. Peut-être pas une bonne solution du point de vue de la consommation de ressources, mais assez simple. 

0
catchakos