80 votes

Comment animer la couleur de fond d'un UILabel ?

On dirait que ça devrait marcher, mais ça ne marche pas. La couleur devient verte immédiatement.

self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
    self.labelCorrection.backgroundColor = [UIColor greenColor];
}];

2 votes

Pour les futurs lecteurs, ceci n'est pas spécifique à UILabel, mais l'exigence est qu'une vue doit commencer avec une couleur de fond, même si cette couleur est claire. Il n'est pas nécessaire d'animer sur le calque, le UIView.backgroundColor fonctionne très bien, à condition de respecter ce qui précède.

149voto

bosmacs Points 4410

Je n'ai pas trouvé de documentation à ce sujet, mais il semblerait que les backgroundColor propriété de UILabel n'est pas animable, car votre code fonctionne très bien avec un modèle vanille. UIView . Cette astuce semble toutefois fonctionner, à condition de ne pas définir la couleur d'arrière-plan de l'affichage de l'étiquette elle-même :

#import <QuartzCore/QuartzCore.h>

...

theLabel.layer.backgroundColor = [UIColor whiteColor].CGColor;

[UIView animateWithDuration:2.0 animations:^{
    theLabel.layer.backgroundColor = [UIColor greenColor].CGColor;
} completion:NULL];

0 votes

Cela fonctionne, merci ! J'aimerais quand même savoir pourquoi un UIView fonctionne, et pas un UILabel, après tout, un UILabel est un UIView.

4 votes

Je suis d'accord. Je ne peux que supposer à ce stade qu'Apple a choisi de rendre ces propriétés non animées pour UILabel . POUR INFO, UIButton se comporte de la même manière que l'étiquette.

2 votes

Curieusement, au moins le frame semble ne pas être animable également si la propriété UILabel provient d'un xib. Cela fonctionne s'il est créé de manière programmatique, mais... c'est bizarre.

7voto

software evolved Points 2125

Vous pouvez l'animer, mais j'ai dû d'abord le régler (par programme) sur clearColor pour une raison quelconque. Sans cela, l'animation ne fonctionnait pas ou n'était pas visible.

Je suis en train d'animer la couleur de fond d'un UILabel dans une cellule de tableau personnalisée. Voici le code de la méthode willDisplayCell. Je n'essaierais pas de définir l'animation dans cellForRow, car une grande partie de la mise en page est modifiée par le tableau.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
        ((RouteListCell *)cell).name.backgroundColor = [UIColor clearColor];
        [((RouteListCell *)cell).name backgroundGlowAnimationFromColor:[UIColor whiteColor] toColor:[UIColor redColor] clearAnimationsFirst:YES];
}

Voici ma routine d'animation :

-(void) backgroundGlowAnimationFromColor:(UIColor *)startColor toColor:(UIColor *)destColor clearAnimationsFirst:(BOOL)reset;
{
    if (reset)
    {
        [self.layer removeAllAnimations];
    }

    CABasicAnimation *anAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    anAnimation.duration = 1.00;
    anAnimation.repeatCount = HUGE_VAL;
    anAnimation.autoreverses = YES;
    anAnimation.fromValue = (id) startColor.CGColor; // [NSNumber numberWithFloat:1.0];
    anAnimation.toValue = (id) destColor.CGColor; //[NSNumber numberWithFloat:0.10];
    [self.layer addAnimation:anAnimation forKey:@"backgroundColor"];
}

2voto

hotpaw2 Points 40796

Faites l'animation des couleurs manuellement, en vous basant sur un rappel NSTimer ou CADisplayLink à une fréquence d'images raisonnable (disons 20 fps). Vous devrez calculer votre propre courbe de changement de couleur en RVB ou HSV sur la base de la fraction du temps écoulé par rapport à la durée totale de l'animation (2,0 secondes dans votre exemple), ou utiliser un tableau de 40 couleurs intermédiaires.

1voto

Phlibbo Points 3536

Tout d'abord, je n'ai pas essayé moi-même, mais j'y ai réfléchi au cours des dernières semaines. Je suppose que la propriété de couleur de votre vue ne peut pas être animée, comme par exemple "cachée", les changements apparaîtront immédiatement. Une solution possible serait de superposer deux étiquettes, celle du haut avec votre ancienne couleur, celle du bas avec la nouvelle. Ensuite, vous pouvez simplement faire disparaître la couleur supérieure. Je ne suis pas sûr, cependant, que le mélange soit agréable à regarder.

1voto

hfossli Points 6815

Il est dit dans les docs que backgroundColor est animable.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW131

Je ne sais pas vraiment depuis quand.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X