2009-09-04 9 views
39

Estoy tratando de crear una moneda que cae. La imagen de la moneda es un CALayer con 2 CABasicAnimations en ella: una caída y una rotación. Cuando la animación de caída llega a su fin, permanece allí. Sin embargo, la animación de rotación, que se supone que es aleatoria y termina en un ángulo diferente cada vez, simplemente regresa a la imagen original de CALAyer.Después de rotar un CALayer usando CABasicAnimation la capa salta a su posición no girada

Quiero que permanezca en el ángulo en el que terminó la animación. ¿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"]; 

Respuesta

79

se ha marcado la propiedad removedOnCompletion de la animación de rotación en NO, por ejemplo,

rota.removedOnCompletion = NO; 

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

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

rota.fillMode = kCAFillModeForwards; 
+0

Lo hice. Agregué el código que utilicé para la pregunta. – Mikle

+9

la cosa fillMode lo resolvió. Dios sabe por qué es eso necesario :) – Mikle

+0

@Allan ¿Alguna idea de por qué 'fillMode' debe establecerse en' kCAFillModeForwards'? – pixelfreak

1

he encontrado 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 implementación o qué, pero al agregar removeAllAnimations al final de la animación pareció despejar este pequeño bit de memoria residual.

[myview.layer removeAllAnimations]; 
+0

¿Está en el simulador o dispositivo? – Pablo

+0

sí, buen punto, estaba en el simulador, y no probé con el dispositivo, que obviamente es el verdadero problema. Fue un aumento muy, muy pequeño. BU, encontré esta causa porque estaba buscando otra fuga usando instrumentos y estaba viendo un extraño comportamiento de memoria. Al hacer esto aislé la verdadera fuga que tuve, y pude tapar el agujero. Nótese que este es xcode 3.2.4 y después de esto, obtuve memoria para regresar constantemente a su número inicial, lo cual se siente bien. – yeahdixon

+1

Estás animando la capa de presentación. Luego debe establecer la propiedad 'transform' de la capa del modelo en el valor final, pero en su lugar, conserva la capa de presentación con' removedOnCompletion = NO', por lo tanto, terminando con dos capas en lugar de una. Es por eso que ves un aumento de la memoria. – Jano

4

Estaba tratando de rotar una flecha hacia adelante y hacia atrás, como el efecto "Pull to Refresh" de Twitter/Facebook.

El problema es, que estaba haciendo la rotación de ida y vuelta en el mismo UIView, así que después de la adición de

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.

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

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

para el i 'restaurar' animación (hacia atrás) Haga esto al finalizar:

myView.transform = CGAffineTransformMakeRotation(0); 

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

+0

Recuperando respuestas antiguas, pero +1 para la cosa 'removeAllAnimations'. Eso hizo que mi parpadeo se detuviera. – Cyrille

Cuestiones relacionadas