tl; dr Es una pila (técnicamente una lista vinculada) de estados de animación pendientes.
UIView es una envoltura alrededor de CALayer. Nada más y nada menos. En ese espíritu, podemos comenzar a ver cómo iOS configura el “contexto de animación implícito”.
Una vista es, por defecto, el delegado de su capa, lo que significa que todo tipo de métodos útiles para dibujar, diseñar y acciones (básicamente, cambios en las rutas clave relevantes como el marco o la escala) se envían a través de ella. En particular, CoreAnimation expone dos métodos delegados con las firmas:
- ¿Por qué está tan terriblemente diseñado iOS 10?
- ¿Cuáles son las diferencias entre certificados, perfiles de aprovisionamiento e identificadores? ¿Qué significan y cómo se relacionan?
- ¿RM 6500 / Month para una experiencia de 3.5 años en el desarrollo de iOS es suficiente para quedarse en Kuala Lampur, Malasia?
- ¿Qué es Corona SDK?
- ¿Es mejor construir una aplicación de iOS con Appcelerator u Objective C?
- (id ) defaultActionForKey: clave (NSString *) - (id ) actionForKey: clave (NSString *)
específicamente para que su delegado pueda intervenir y especificar cómo se deben manejar los cambios de propiedad. Si uno devuelve NSNull
o cualquier otra cosa nula, el cambio de propiedad simplemente se confirma en el árbol de capas con una sacudida y eso es todo. Sin embargo, si se devuelve una animación (por ejemplo, una instancia simple de CABasicAnimation), el cambio de propiedad ejecutará la animación para nosotros.
De esto, todo lo que nos falta es cómo almacenar ese estado. Después de todo, los bloques de animación se pueden anidar, ¡y ese bloque interno heredaría la duración y las acciones del bloque externo y arruinaría el efecto si utilizáramos un modelo plano! En cambio, cuando llamas a + animateWithDuration … y parientes, UIKit asigna una estructura para mantener el estado de animación que tiene un miembro que hace referencia al siguiente estado de animación si existe.
En la práctica, lo que esto significa es que puede anidar animaciones simplemente asignando una nueva estructura y luego configurando el campo “próxima animación” de la anterior. Cuando llega el momento de ejecutar, desactiva el estado de la animación, espera a que se completen todas las acciones y luego verifica si existe la siguiente animación. Si es así, ejecute ese y espere hasta la saciedad hasta que llegue al contexto de animación más alto.