Animación suave en CAKeyframeAnimation para animaciones CATransform3D

He creado mi propia animation de transición entre vistas. Animo dos properties, la position y la transformación, para proporcionar una transición similar a un cubo entre las vistas. La ttwig utiliza CABasicAnimation mientras que la transformación utiliza una "2 etapas" CAKeyframeAnimation . Todo funciona bien, excepto por un pequeño detalle que no puedo entender. En mi transición aplico una CATransform3DScale en el marco de la key central para crear un efecto de acercamiento / CATransform3DScale . Eso funciona bien, excepto que la animation se ve ligeramente desigual. Está animando entre los cuadros key de forma lineal, y me gustaría suavizarlo. Ahora CAKeyframeAnimation tiene una forma de hacer eso usando calculationMode , pero no parece funcionar para transformaciones. He intentado configurarlo en kCAAnimationCubic y kCAAnimationCubicPaced sin efecto.

Aquí está el código que anima la transformación de una vista (un bloque similar de código anima la otra vista):

  CAKeyframeAnimation *aTransform = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; CATransform3D transform1 = RotateOnX(toView, M_PI_4); transform1 = CATransform3DScale(transform1, RotationalZoom, RotationalZoom, RotationalZoom); [aTransform setValues:Array([NSValue valueWithCATransform3D:RotateOnX(toView, M_PI_2)], [NSValue valueWithCATransform3D:transform1], [NSValue valueWithCATransform3D:RotateOnX(toView, 0)])]; [toView.layer addAnimation:aTransform forKey:@"transform"]; 

Nota: RotateOnX(UIView *, CGFloat) es un bloque que devuelve una transformación para una vista girada en X por los radianes deseados.

Como puede ver, solo establezco una transformación de escala en el marco de key central. Además, la rotation de la vista es perfectamente fluida, solo la escala que parece "sacudida" cambia de dirección.

¿Alguien tiene alguna idea sobre cómo suavizar el escalado / zoom?

Prueba la propiedad timingFunctions . Dado que tiene 3 fotogtwigs key, necesita 2 funciones de synchronization: una para la animation desde el fotogtwig key 0 al fotogtwig key 1 y otra para la animation desde el fotogtwig key 1 al fotogtwig key 2.

 aTransform.timingFunctions = [NSArray arrayWithObjects: [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInOut], [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInOut], nil];