Cómo animar el color de fondo de un UILabel?

Parece que debería funcionar, pero no es así. El color se vuelve verde de una vez.

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

No puedo encontrarlo documentado en ningún lado, pero parece que la propiedad backgroundColor de UILabel no es animable, ya que tu código funciona bien con un UIView vanilla. Sin embargo, este truco parece funcionar, siempre que no establezca el color de fondo de la vista de etiqueta en sí:

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

Rápido

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

     override func viewDidLoad() { super.viewDidLoad() myLabel.backgroundColor = UIColor.clear } 
  2. Anima 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 CGColor se agrega después del UIColor .

Resultado

enter image description here

Puedes animarlo, pero primero tuve que configurarlo (programáticamente) para borrar Color 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í está 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"]; } 

Swift 3

Para animar el color de fondo de su etiqueta de blanco a verde, configure su etiqueta así:

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

Animate así:

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

Para volver al estado original, para que pueda animar nuevamente, asegúrese de eliminar las animaciones:

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

Haga la animación de color manualmente, en función de una callback de NSTimer o CADisplayLink a una velocidad de fotogtwigs razonable (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.

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 el marco POP de Facebook (no solo) para eso.

Puede hacer fácilmente animaciones de propiedades básicas tanto en la vista como en la capa, pero además, proporciona una transición suave entre los colores (y básicamente lo que desee, incluso sus tipos personalizados, con alguna encoding adicional). Entonces, para el color de fondo, harías 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 puedes animar colores de fondo en todo lo que tiene esa propiedad!

Si no desea profundizar en 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 usted puede anima el color de fondo de UIView (lo he intentado y funciona para mí).

Por favor, intente 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) { }]; 

Esto funciona para mi.

Aquí está la referencia:

animaciones Un objeto de bloque que contiene los cambios para comprometerse con las vistas. Aquí es donde modifica mediante progtwigción las propiedades animables de las vistas en su jerarquía de vistas. Este bloque no toma parámetros y no tiene valor de retorno. Este parámetro no debe ser NULL

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

Extensión Swift 4.1 UILabel:

Agrega esta extensión a tu código:

 extension UILabel { /** Animates the background color of a UILabel to a new color. */ func animateBackgroundColor(to color : UIColor?, withDuration : TimeInterval, completion : ((Bool) -> Void)? = nil) { guard let newColor = color else { return } self.backgroundColor = .clear UIView.animate(withDuration: withDuration, animations: { self.layer.backgroundColor = newColor.cgColor }, completion: completion) } } 

Deberías usarlo así:

 myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5) 

Ahora, si quieres restaurar el color original, úsalo así:

 // Storing the orignal color: let originalColor = myUILabel.backgroundColor // Changing the background color: myUILabel.animateBackgroundColor(to: .red, withDuration: 0.5) // ... Later: // Restoring the original color: myUILabel.animateBackgroundColor(to: originalColor, withDuration: 0.5, completion: { (value: Bool) in myUILabel.backgroundColor = originalColor })