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
He intentado utilizar MVA (observación clave-valor) en la ruta de acceso clave del
bounds.origin
presentationLayer
'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. ObservarpresentationLayer.bounds.origin
como keypath no funciona.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.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.
- sólo funciona si el
he intentado programar una
NSTimer
, y dentro de la devolución de llamada temporizador muestrear lapresentationLayer
. 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.
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. –
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. –
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 ... " –