Después de la rotación de un CALayer usando CABasicAnimation la capa salta de nuevo a su posición sin girar

StackOverflow https://stackoverflow.com/questions/1376753

Pregunta

Estoy tratando de crear una moneda que cae. La imagen de la moneda es un CALayer con 2 CABasicAnimations en él - una caída hacia abajo y una rotación de uno. Cuando la caída de la animación que llega a su fin, se queda allí. La animación de la rotación, sin embargo, que se supone que es al azar y terminan en un ángulo diferente cada vez, sólo aparece una copia de la imagen original, CALayer.

Quiero que se quede en el ángulo en que terminó la animación en. ¿Es posible? ¿Cómo lo hago?

Código:

//Moving down animation:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
anim.duration = 1;
anim.autoreverses = NO;
anim.removedOnCompletion = YES;

anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)];
anim.toValue = [NSNumber numberWithInt: 0];

//Rotation Animation:
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rota.duration = 4;
rota.autoreverses = NO;
rota.removedOnCompletion = NO;
rota.fromValue = [NSNumber numberWithFloat: 0];
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ];
[cl addAnimation: rota forKey: @"rotation"];
[cl addAnimation: anim forKey: @"animateFalling"];
¿Fue útil?

Solución

¿Ha establecido la propiedad removedOnCompletion de la animación de rotación en NO, por ejemplo.,

rota.removedOnCompletion = NO;

Esto debería dejar la capa de presentación donde estaba cuando terminó la animación. El valor predeterminado es SÍ, que se ajustará al valor del modelo, es decir, el comportamiento que usted describe.

El FILLMODE también se debe establecer, es decir,

rota.fillMode = kCAFillModeForwards;

Otros consejos

Yo estaba tratando de girar una flecha hacia atrás y hacia adelante, como el Twitter / Facebook "Tirar para refrescar" efecto.

El problema es, que estaba haciendo la rotación de ida y vuelta en el mismo UIView, por lo que después de añadir

rotation.removedOnCompletion = NO;
rotation.fillMode = kCAFillModeForwards;

La guerra de animación hacia adelante trabajando bien, pero la animación hacia atrás no funcionaba en absoluto.

Así que he añadido la última línea sugerida por yeahdixon, y, además, establecer el punto de vista de transformar al estado completo de la animación: (rotación de 180 grados)

[myview.layer removeAllAnimations];
myView.transform = CGAffineTransformMakeRotation(M_PI);

Para la animación 'restaurar' (hacia atrás) lo hago en ejecución:

myView.transform = CGAffineTransformMakeRotation(0);

... y funciona bien. De alguna manera que no necesita la llamada removeAllAnimations.

He descubierto que mediante el establecimiento de: removedOnCompletion = NO;

no produjeron una fuga visible en los instrumentos, pero no consiguió desasignado y estaba acumulando una pequeña cantidad de memoria. IDK si es mi aplicación o qué, pero añadiendo removeAllAnimations al final de la animación parecían despejar esta pequeña cantidad de memoria residual.

[myview.layer removeAllAnimations];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top