2010-09-21 16 views
67

Parece que debería funcionar, pero no es así. El color se vuelve verde de una vez.Cómo animar el color de fondo de un UILabel?

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

Para cualquier futuros lectores, esto no es específico de UILabel, pero el requisito es que una vista debe comenzar con un color de fondo, incluso si ese color es claro. No necesita animar en la capa, UIView.backgroundColor funciona bien, siempre que lo anterior. –

Respuesta

131

Yo no lo encuentro documentado en cualquier lugar, pero parece que la propiedad de backgroundColorUILabel no es animatable, como su código funciona bien con una vainilla UIView. Este truco parece funcionar, sin embargo, siempre y cuando no se establece el color de fondo de la propia etiqueta de vista:

#import <QuartzCore/QuartzCore.h> 

... 

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

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

Esto funciona, ¡gracias! Todavía me gustaría saber por qué funciona un UIView, y un UILabel no lo hace, después de todo, un UILabel es un UIView. –

+3

De acuerdo. Solo puedo suponer en este punto que Apple eligió hacer esas propiedades no animadas para 'UILabel'. FWIW, 'UIButton' se comporta de la misma manera que la etiqueta. – bosmacs

+2

Por extraño que parezca, al menos la propiedad 'frame' tampoco parece ser animable si el' UILabel' proviene de un xib. Funciona si se crea programáticamente, aunque ... extraño. –

0

su referencia es:

animaciones Un objeto de bloques que contiene los cambios a comprometerse a las vistas. Aquí es donde programáticamente cambia las propiedades animables de las vistas en la jerarquía de su vista. Este bloque no toma parámetros y no tiene valor de retorno. Este parámetro no debe ser nulo

Lo que entiendo de esto es cuando su vista llamar al bloque de animación, entonces su vista en color fondo de la etiqueta se compromete a ser de color verde desde entonces. Luego, si no cambia el color de fondo de la etiqueta a otra cosa, siempre será verde. Esto es lo que supongo

2

hacer la animación de color de forma manual, con sede fuera de una devolución de llamada o NSTimer CADisplayLink en algún tiempo razonable tasa (digamos 20 fps). Tendrá que calcular su propia curva de cambio de color en RGB o HSV en función del tiempo fraccional transcurrido durante el tiempo de animación completo (2,0 segundos en su ejemplo), o utilizar una matriz de 40 colores intermedios.

1

Si no desea bajar a Cuarzo, por cada respuesta una de las respuestas previas, cree una UIView vacía del mismo tamaño que UILabel y colóquela en el mismo lugar que UILabel (y en orden Z, debajo de ella) y puedes animar ese color de fondo de UIView (lo he intentado y funciona para mí).

6

Puedes animarlo, pero primero tuve que configurarlo (programáticamente) para clearColor por alguna razón. Sin eso, la animación o no funcionaba o no era visible.

Estoy animando el color de fondo de un UILabel en una celda de tabla personalizada. Aquí está el código en el método willDisplayCell. No trataría de configurar la animación en cellForRow, ya que la tabla revisa mucho el diseño.

- (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]; 
} 

Aquí es mi rutina de animación:

-(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"]; 
} 
1

Inténtelo esto,

[UIView transitionWithView:yourView duration:0.2 options:UIViewAnimationOptionTransitionNone animations:^{ 

[yourView setBackgroundColor:[UIColor colorWithRed:0.8588 green:0.8588 blue:0.8588 alpha:1]]; 
    }completion:^(BOOL finished) { 

}]; 

Funciona para mí.

2

Recientemente me encontré con este problema una vez más y después de algunas investigaciones, pensé que básicamente nada había cambiado (y probablemente no en un futuro previsible), así que terminé usando Facebook POP framework (no solo) para eso.

Puede realizar fácilmente animaciones de propiedades básicas tanto en vista como en capa, pero además, proporciona una transición suave entre los colores (y básicamente lo que desee, incluso sus tipos personalizados, con alguna codificación adicional). Así que para el color de fondo, usted haría algo como esto:

// Create spring animation (there are more types, if you want) 
    let animation = POPSpringAnimation(propertyNamed: kPOPViewBackgroundColor) 

    // Configure it properly 
    animation.autoreverses = false 
    animation.removedOnCompletion = true 
    animation.fromValue = UIColor.yourBeginningColor() 
    animation.toValue = UIColor.yourFinalColor() 

    // Add new animation to your view - animation key can be whatever you like, serves as reference 
    label.pop_addAnimation(animation, forKey: "YourAnimationKey") 

Viola, ahora se pueden animar colores de fondo en todo lo que tenga de este inmueble!

11

Swift

  1. (importante) Establecer color de fondo de la UILabel para borrar (ya sea en IB o en el código). Por ejemplo:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        myLabel.backgroundColor = UIColor.clear 
    } 
    
  2. Animar el color de fondo de la capa.

    @IBAction func animateButtonTapped(sender: UIButton) { 
    
        UIView.animate(withDuration: 1.0, animations: { 
         self.myLabel.layer.backgroundColor = UIColor.red.cgColor 
        }) 
    } 
    

Tenga en cuenta que se añade después de la CGColorUIColor.

Resultado

enter image description here

3

Swift 3

Para animar el color de fondo de la etiqueta del blanco al verde, configurar su etiqueta como esta:

self.labelCorrection.backgroundColor = UIColor.clear 
self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor 

Animate como este:

UIView.animate(withDuration: 2.0) { 
    self.labelCorrection.layer.backgroundColor = UIColor.green.cgColor 
} 

Para volver al estado original, por lo que puede animar de nuevo, asegúrese de eliminar animaciones:

self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor 
self.labelCorrection.layer.removeAllAnimations() 
Cuestiones relacionadas