2012-04-15 22 views
5

En mi aplicación iOS 5 tengo un UIButton personalizado que tiene un orbe rojo como imagen. Cuando se toca el botón, me gustaría que el orbe comience a pulsar/desvanecerse entre rojo y verde. Tengo dos imágenes rojas y verdes y puedo éxito cruzada disolver entre los dos usando el siguiente código:Animación en bucle, reversible con Core Animation

CABasicAnimation *imageSwitchAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];  
imageSwitchAnimation.fromValue = (id)[UIImage imageNamed:@"red.png"].CGImage; 
imageSwitchAnimation.toValue = (id)[UIImage imageNamed:@"green.png"].CGImage; 
imageSwitchAnimation.duration = 1.5f;   
[self.button.imageView.layer addAnimation:imageSwitchAnimation forKey:@"animateContents"]; 

Sin embargo, me gustaría que la animación continuará para siempre (bueno, hasta que me diga que se detenga) y también para la animación para invertir y repetir. En otras palabras, desvanezca rojo -> verde -> rojo y luego repita.

Intenté poner el bloque de animación arriba en un bucle infinito (junto con cierta lógica para determinar si el desvanecimiento debería pasar de rojo -> verde o verde -> rojo) pero esto simplemente bloquea toda la aplicación.

Otras soluciones parecen usar Cocos2d, que parece bastante pesado, ya que esta es la única animación que necesito en la aplicación (por lo que no quiero utilizar tales marcos a menos que sea absolutamente necesario).

Cualquier ayuda sería muy apreciada.

Respuesta

23

Sí, puede hacerlo, justo dentro de CABasicAnimation. El truco es que muchos de sus métodos más importantes no están en el CABasicAnimation Class Reference, o incluso en sus superclases. CABasicAnimation implementa un protocolo llamado CAMediaTiming. Vea el CAMediaTiming Protocol Reference.

Desea conocer dos propiedades en particular: autoreverses y repeatCount. Ambos se explican por sí mismos, pero ¿qué pasa si quieres repeticiones infinitas? De la entrada para repeatCount:

Puede ser fraccionario. Si el repeatCount es 0, se ignora. El valor predeterminado es 0. Si se especifican repeatDuration y repeatCount, el comportamiento no está definido.

Establecer esta propiedad en HUGE_VALF hará que la animación se repita para siempre.

¿Se puede resolver desde allí?

+0

Muchas gracias, ¡esto funciona a la perfección! Muy claramente explicado también :) – Skoota

Cuestiones relacionadas