2012-09-16 19 views
16

Quiero crear una animación CALayer que dé una especie de efecto 'llamativo'. Para eso estoy tratando de animar la propiedad 'opacidad', pero mi problema es que no tengo idea de dónde empezar y cómo hacerlo.Animación de opacidad CALayer

Aquí es una explicación gráfica de la animación:

opacity 
    | ___ 
1 | | | 
    | | | * repeatCount 
0 |___| |_ . . . 
    -------------------------> time 
    |______| 
    duration 

La opacidad comienza a las 0, entonces anima a 1, a continuación, a 0 de nuevo (esta animación 0-a-1-a-0 toma un número de segundos igual a la duración). Entonces este proceso se repite veces 'repeatCount'.

He aquí algunos antecedentes sobre el código:

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc 
int repeactCount = ...; // 1, 2, 5, 6, ect 

CALayer* layer = ...; // I have a CALayer from another part of the code 
layer.opacity = 0; 

// Animation here 

done = YES; // IN THE END of the animation set this ivar to yes 

¿Cuál es la mejor manera de lograr esto? Nunca antes había usado CALayers, así que esta es también una buena oportunidad para aprender cómo funciona su sistema de animación. Por cierto, he buscado en los documentos y entiendo cómo se agregan una o dos animaciones simples, pero no tengo idea de cómo hacer esto en particular.

+0

upvote para el gráfico XD –

Respuesta

40

La mejor manera de lograr esto es utilizar una animación explícita (vea guide) creando una instancia de CABasicAnimation y agregándola a la capa.

El código sería algo como esto:

CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
flash.fromValue = [NSNumber numberWithFloat:0.0]; 
flash.toValue = [NSNumber numberWithFloat:1.0]; 
flash.duration = 1.0;  // 1 second 
flash.autoreverses = YES; // Back 
flash.repeatCount = 3;  // Or whatever 

[layer addAnimation:flash forKey:@"flashAnimation"]; 

Si usted quiere saber cuando la animación se hace se puede establecer un delegado y poner en práctica el método animationDidStop:finished:, sin embargo, lo mejor es utilizar un bloque de terminación como el permite que todo el código esté en el mismo lugar. Si está escribiendo para iOS 4 o OS X, puede usar la excelente categoría CAAnimationBlocks para lograr esto.

+0

¡Gracias! Eso funciona perfectamente. Solo una cosa: es 'animationWithKeyPath:' – Alex

+0

@Alex OK, actualizaré la respuesta (fue de memoria, no siempre la fuente más confiable ...) – trojanfoe

+0

No entiendo. Se desvanece y luego desaparece de inmediato. –

0

La respuesta de Trojanfoe es excelente. Solo quiero agregar que si quieres tener más control sobre la "línea de tiempo" (¿cuánto tiempo tardará en desvanecerse? ¿Cuánto tiempo deberíamos esperar? ¿Entonces cuánto tiempo tardarás en desvanecerse? Y así sucesivamente) estás va a querer combinar múltiples CABasicAnimation s en un CAAnimationGroup.

Es posible que desee leer mi capítulo de un libro sobre este tema, la última parte de los cuales constituye un tutorial sobre CAAnimation y su descendencia:

http://www.apeth.com/iOSBook/ch17.html#_core_animation

Tenga en cuenta que mi discusión se dirige a IOS; en Mac OS X, si es donde está, la arquitectura de vista/capa es un poco diferente, pero lo que dice sobre CAAnimation sigue siendo correcto.

Cuestiones relacionadas