Así que es bueno que hayas averiguado las cosas aquí, pero la respuesta a tu pregunta tiene algunas inexactitudes. Permítanme corregir algunas cosas:
La propiedad de marco puede estar animada, pero no con animación explícita. Si hace lo siguiente a una capa distinta de la capa raíz de un punto de vista, el marco se animará bien:
[CATransaction begin];
[CATransaction setAnimationDuration:2.0f];
[animationLayer setFrame:CGRectMake(100.0f, 100.0f, 100.0f, 100.0f)];
[CATransaction commit];
Recuerde que el establecimiento de una propiedad en una capa se animar a que el cambio de propiedad por defecto. De hecho, debe desactivar las animaciones en un cambio de propiedad si no desea que se anime. (Por supuesto, esto solo es cierto si está animando una capa que no sea la capa raíz de una vista). Tiene razón al animar tanto la posición como los límites si necesita usar una animación explícita.
Usted puede animar el marco en una UIView usando animación implícita:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
[[self view] setFrame:CGRectMake(45.0f, 45.0f, 100.0f, 100.0f)];
[UIView commitAnimations];
Esto animará de trama actual de la vista (límites y posición) a x = 45,0, y = 45,0, w = 100,0 , h = 100.0.
Parece que también puede estar malinterpretando la diferencia entre una animación y una capa. Agrega animaciones a las capas, pero agregar una animación a una capa no establece automáticamente la propiedad que está animando.
CALayers son objetos modelo. Contienen información sobre la capa que eventualmente se procesa en la pantalla. Usted debe establecer la propiedad de una capa si desea que esa propiedad tenga realmente ese valor. Si simplemente anima la propiedad, solo será una representación visual y no real, lo que significa que el valor vuelve al valor original de la capa porque nunca la cambió realmente.
Lo que me lleva al siguiente punto. Usted dijo:
Uso "animation.removedOnCompletion = NO; animation.fillMode = kCAFillModeForwards;" para asegurar que los valores no se resetean al final de la animación
Esto no es exactamente correcto. Estos dos valores simplemente hacen que la animación permanezca en su posición final visualmente, sin embargo, los valores reales de la capa no han cambiado. Siguen siendo exactamente los mismos valores que cuando comenzaste la animación. En general (con algunas excepciones) no desea utilizar estos dos parámetros porque son visual solamente. Lo que desea es establecer realmente el valor de capa para la propiedad que está animando.
Digamos, por ejemplo, que desea animar la posición de su capa mediante una animación explícita. Aquí está el código que desea:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setFromValue:[NSValue valueWithCGPoint:CGPointMake(70.0f, 70.0f)]];
[animation setToValue:[NSValue valueWithCGPoint:CGPointMake(150.0f, 150.0f)]];
[animation setDuration:2.0f];
// Actually set the position on the *layer* that you want it to be
// when the animation finishes.
[animationLayer setPosition:CGPointMake(150.0f, 150.0f)];
// Add the animation for the position key to ensure that you
// override the animation for position changes with your animation.
[animationLayer addAnimation:animation forKey:@"position"];
También le recomendamos considerar agrupar animaciones. Con un grupo de animación, puede agrupar varias animaciones y luego controlar cómo se relacionan entre sí.En su caso, la duración de sus límites y las animaciones de posición son las mismas, por lo que lo que está intentando hacer funcionará bien sin un grupo, pero si desea compensar el inicio de las animaciones, por ejemplo, no desea el puesto. Para comenzar la animación hasta uno o dos segundos en la animación de cuadros, puede escalonarlos estableciendo el valor beginTime de la animación de posición.
Finalmente, me gustaría saber por qué no puede usar las animaciones implícitas disponibles en UIView. Los uso en la gran mayoría del código de Core Animation que escribo y no puedo ver por qué esto no funcionaría para su situación.
Saludos cordiales.
Gracias por la explicación Matt. Pero para el problema de animación de UIView, estaba relacionado solo con mi capa. Por lo general, no tengo ningún problema con la animación con UIView, pero en mi caso causaba comportamientos extraños. Cambiar el tamaño del marco de vista no cambia el tamaño de la capa en el iPhone (ya que no hay un mecanismo automático en iPhone, solo para vistas y subvistas). Entonces, tienes que hacerlo "manualmente". – Sauleil
¡Buena respuesta! Muy detallado. Te habría dado 2 puntos en caso de que pudiera. – Soberman