2009-02-05 15 views
33

Estoy intentando construir una CABasicAnimation para animar la propiedad backgroundColor de un CALayer de Core Animation, pero no puedo encontrar la forma de ajustar correctamente un valor de CGColorRef para pasar a la animación. Por ejemplo:¿Cómo se anima explícitamente un backgroundColor de CALayer?

CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat values[4] = {1.0, 0.0, 0.0, 1.0}; 
CGColorRef red = CGColorCreate(rgbColorspace, values); 
CGColorSpaceRelease(rgbColorspace); 

CABasicAnimation *selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
[selectionAnimation setDuration:0.5f]; 
[selectionAnimation setToValue:[NSValue valueWithPointer:red]]; 
[layer addAnimation:selectionAnimation forKey:@"selectionAnimation"]; 

parece no hacer nada a la propiedad backgroundColor, supongo que porque la entrega, ya que un puntero envuelto en una NSValue no es la manera de pasar a lo largo.

backgroundColor es una propiedad animable de CALayer, por lo que mi pregunta es: ¿cómo se configuran los valores From o To para esta propiedad en particular (preferiblemente en una plataforma independiente de Mac/iPhone)?

Respuesta

57

No es necesario para envolver CGColorRef s la hora de establecer los toValue o fromValue propiedades de un CABasicAnimation. Simplemente use el CGColorRef. Para evitar la advertencia del compilador, puede convertir CGColorRef en id.

En mi aplicación de ejemplo, el siguiente código animó el fondo a rojo.

CABasicAnimation* selectionAnimation = [CABasicAnimation 
    animationWithKeyPath:@"backgroundColor"]; 
selectionAnimation.toValue = (id)[UIColor redColor].CGColor; 
[self.view.layer addAnimation:selectionAnimation 
         forKey:@"selectionAnimation"]; 

Sin embargo, cuando la animación termina, el fondo vuelve al color original. Esto se debe a que CABasicAnimation solo afecta la capa de presentación de la capa de destino mientras se ejecuta la animación. Una vez que finaliza la animación, vuelve el valor establecido en la capa del modelo. Así que tendrá que establecer la propiedad de las capas backgroundColor en rojo también. Quizás apague las animaciones implícitas usando CATransaction.

Puede ahorrarse este problema al usar una animación implícita en primer lugar.

+13

Sweet. Pensarías que documentarían el encasillamiento a id en alguna parte. Sí, podría hacer mi vida más fácil con una animación implícita, pero esto me estaba molestando. Para que esto persista, todo lo que necesita es establecer el modo de relleno de la animación en kCAFillModeForwards y removedOnCompletion en NO. –

+0

+1 ¡Agradable, funciona como un encanto! –

+0

O puede ahorrarse un montón de tiempo y utilizar la biblioteca de Facebook Pop: https://github.com/facebook/pop. Ejemplos aquí: https://github.com/maxmyers/FacebookPop – Benjamin

2

Estaba luchando con este problema hasta que encontré experimentalmente la barricada. Establecer la propiedad backgroundColor de la capa, ya sea directamente o mediante la animación, no tendrá efecto si cambia el color de fondo del predeterminado (no especificado) en Interface Builder, en el contexto de un elemento (como UILabel) que es sido colocado en IB. Por lo tanto, deje el color de fondo sin especificar y lo anterior debería funcionar.

Cuestiones relacionadas