Cómo animar sincrónicamente un UIView y un CALayer

Para ilustrar esta pregunta, escribí un proyecto Xcode muy pequeño en Github (dos clases, descarga de 11kb).Echa un vistazo a la esencia aquí. o usargit clone [email protected]: 93982af3b65d2151672e.git.

Por favor considere el siguiente escenario. Una vista personalizada de la mía, llamada'vista de contenedor', contiene dos cuadraditos. Ilustrado en esta captura de pantalla:

El cuadrado azul es un 22x22 pt.UIView instancia y el cuadrado rojo es un 22x22 ptCALayer ejemplo. Para los propósitos de esta pregunta, quiero que los dos cuadrados se "peguen" a la esquina inferior derecha de la vista exterior, mientras animo el marco de esa vista exterior.

Cambio el marco de la vista del contenedor dentro de unUIViewmétodo de claseanimateWithDuration:delay:options:animations:completion:, con un parámetro de suavizado no predeterminado de tipoUIViewAnimationCurveEaseOut.

[UIView animateWithDuration:1.0 delay:0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{ _containerView.frame = randomFrame; } 
                 completion:nil];

Nota: Tanto el marco azul de UIView como el rojo de CALayer se configuran en el texto anulado.setFrame: Método de la vista de contenedor, pero los resultados habrían sido los mismos si hubiera configurado el UIView azulautoresizingMask Propiedad a UIView con márgenes izquierdo y superior flexibles.

En la animación resultante, el cuadrado azul se "pega" a la esquina de la manera que lo pretendía, pero el cuadrado rojo ignora por completo el tiempo y la suavización de la animación. Supongo que esto se debe a la función de animación implícita de Core Animation, una función que me ha ayudado en muchas ocasiones antes.

Aquí hay algunas capturas de pantalla en la secuencia de animación que ilustran la asincronía de los dos cuadrados:

A la pregunta:¿Hay alguna manera de sincronizar los dos cambios de cuadro para que tanto el CALayer rojo como el UIView azul se muevan con la misma duración de animación y curva de suavizado, pegados entre sí como si fueran una vista?

PD Por supuesto, el resultado visual requerido de los dos cuadrados pegados podría lograrse de muchas maneras, por ejemplo, haciendo que ambas capas se conviertan enCALayers oUIViews, pero el proyecto en el que se encuentra el problema real tiene una causa muy legítima para que uno sea un CALayer y el otro para ser un UIView.

Respuestas a la pregunta(2)

Su respuesta a la pregunta