iphone - para - Observando cambios de propiedades animadas en un CALayer
como funciona clips de apple (2)
Creo que has nombrado todas las posibilidades. De hecho, ni siquiera estaba al tanto de los números 2 y 3 y escribí el libro sobre Core Animation . ;-)
KVO no está disponible para estas propiedades. Estaría bien si lo fuera, pero creo que la razón de esto tiene que ver con los gastos generales que llevaría. El valor se actualizaría con mucha frecuencia y tendría que volver a llamar a cualquier observador.
De todos modos, he encontrado que el NSTimer es el enfoque más confiable, pero ahora no estoy seguro de lo que has dicho. ¿Qué te hace pensar que el temporizador no está sincronizado? ¿Por qué es difícil hacer que el temporizador solo se dispare 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 no se cumple la condición?
Atentamente.
Tengo un CABasicAnimation
que anima una propiedad de un CALayer
por ejemplo, bounds.origin
. Quiero poder observar cómo cambia la propiedad con el tiempo, pero realmente no he encontrado un método que funcione al 100%.
Intenté usar KVO (observación de clave-valor) en la
bounds.origin
acceso de la páginabounds.origin
Lays. El sistema se queja de que el objeto se libera antes de que se liberen sus observadores, lo que me lleva a pensar que la capa de presentación es solo temporal. La observación depresentationLayer.bounds.origin
como keypath no funciona.Intenté crear una propiedad en otra capa y animar eso, por ejemplo, declarando la
@property
y convirtiéndola en@dynamic
en esa capa. Sin embargo, esta nueva propiedad solo se modifica cuando se accede a la capa de presentación (por ejemplo, al final de la animación), parece que no se actualiza mientras se ejecuta la animación.Utilicé
needsDisplayForKey
en la propiedad en el # 2, queneedsDisplayForKey
las actualizaciones durante la animación, pero para estos problemas:- solo funciona si
CALayer
tiene un marco distinto de cero. Como esta capa puede ser un CAShapeLayer o una subclase, puede tener un cuadro cero. - parece que activa
setNeedsDisplay
para esa capa, pero como no estoy dibujando esa capa solo monitoreando el cambio de propiedad, no quiero que se vuelva a dibujar.
- solo funciona si
Intenté programar un
NSTimer
, y dentro de la devolución de llamada del temporizador,NSTimer
elpresentationLayer
. Esto también funciona pero para estas cuestiones:- El temporizador probablemente no esté sincronizado con la actualización de la animación.
- Dado que ocasionalmente la animación original se anticipa a otra animación, es difícil hacer que el temporizador se active cuando la animación se está ejecutando y solo cuando la animación se está ejecutando.
¿Alguna sugerencia? Todo esto estaría en iPhoneOS 3.0 / 3.1.
Intente usar CADisplayLink, que está diseñado para mantenerse sincronizado con el ciclo de animación. Más información: https://ashfurrow.com/blog/animating-views-with-cadisplaylink/