2009-10-13 10 views
24

Tengo un CABasicAnimation que anima una propiedad de CALayer p. bounds.origin. Quiero poder observar la propiedad cambiando con el tiempo, pero realmente no he encontrado un método que funcione al 100%.Observación de cambios de propiedades animadas en un CALayer

  1. He intentado utilizar MVA (observación clave-valor) en la ruta de acceso clave del bounds.originpresentationLayer 's. El sistema se queja de que el objeto se libera antes de que sus observadores se liberen, lo que me lleva a pensar que la capa de presentación es solo temporal. Observar presentationLayer.bounds.origin como keypath no funciona.

  2. Intenté crear una propiedad en otra capa y animarla, p. al declarar el @property y hacerlo @dynamic en esa capa. Sin embargo, esta nueva propiedad solo cambia cuando se accede a la capa de presentación (por ejemplo, al final de la animación), no parece actualizarse mientras se está ejecutando la animación.

  3. que utilizan needsDisplayForKey en la propiedad en el # 2, que hace desencadenar cambios durante la animación, pero para estos temas:

    • sólo funciona si el CALayer tiene la estructura que no sea cero. Como esta capa puede ser una CAShapeLayer o subclase, puede tener un marco cero.
    • parece que desencadena setNeedsDisplay para esa capa, pero como en realidad no dibujo esa capa solo supervisando el cambio de propiedad, no deseo que vuelva a dibujarse.
  4. he intentado programar una NSTimer, y dentro de la devolución de llamada temporizador muestrear la presentationLayer. Esto también funciona, pero para estos problemas:

    • El temporizador probablemente no se sincronizará un poco con la actualización de la animación.
    • Dado que ocasionalmente la animación original se deja sin efecto por otra animación, es difícil hacer que el temporizador se dispare cuando la animación se está ejecutando y solo cuando la animación se está ejecutando.

¿Alguna sugerencia? Todo esto sería en iPhoneOS 3.0/3.1.

Respuesta

5

Creo que ha mencionado todas las posibilidades. De hecho, ni siquiera estaba al tanto de # 2 y # 3 y escribí the book on Core Animation. ;-)

KVO no está disponible para estas propiedades. Sería bueno si lo fuera, pero creo que la razón de esto tiene que ver con los gastos generales que tomaría. El valor se actualizará con mucha frecuencia y tendrá que devolver la llamada a cualquier observador.

De todos modos, el NSTimer me pareció el enfoque más confiable, pero ahora no estoy seguro de lo que ha dicho. ¿Qué te hace pensar que el temporizador no está sincronizado? ¿Por qué es difícil obtener el temporizador solo para disparar cuando la animación se está ejecutando? ¿No puede simplemente verificar la condición que desea en la devolución de llamada del temporizador y luego no hacer nada si la condición no se cumple?

saludo.

+1

NSTimers se disparan sin tener en cuenta cuando se actualizan las capas reales, siempre estarían ligeramente detrás o delante del paso de animación de la capa. Lo que necesitaría es ser notificado * al mismo tiempo * como la animación de la capa. La mejor opción es usar CADisplayLink (solo iPhone 3.1) o crear una capa artificial con la opción n. ° 3 para recibir notificaciones. Al final, como el entorno es tan dinámico, abandoné el uso de Core Animation para hacerlo. Ahora estoy usando NSTimer o CADisplayLink para hacer el desplazamiento automático. –

+0

Cuando descargo automáticamente, a veces hay una animación de autoscroll existente en la capa que estoy reemplazando, y algunas veces la animación inicial tiene que retrasarse 1/2 segundo. Por lo tanto, es difícil saber * cuándo se está ejecutando la animación real. Las devoluciones de llamadas de los delegados de CAAnimation tampoco ocurren instantáneamente, por lo que existe la posibilidad de que cualquier código que dependa de él no esté sincronizado con lo que ya sucedió en la capa animada. –

+2

Ver por ejemplo: http://developer.apple.com/mac/library/qa/qa2004/qa1385.html. El documento de Apple dice "NSTimer es un temporizador de propósito general. No es un temporizador vinculado al dispositivo de visualización. El intervalo, y el instante en que el temporizador comenzó a disparar, no tienen relación con cuando ocurre la actualización vertical. Esto significa que el enfoque simple de crear un temporizador a "60.0" Hz está condenado al fracaso: el temporizador se desplazará en relación con la frecuencia de actualización real, y usted soltará o duplicará los fotogramas. También significa que el temporizador llama a la aplicación en un punto arbitrario en el actualizar ... " –

Cuestiones relacionadas