2009-09-04 12 views
39

Sto provando a creare una moneta che cade. L'immagine della moneta è un CALayer con 2 CABasicAnimations su di esso - una caduta verso il basso e una rotazione. Quando l'animazione che cade scende alla fine, rimane lì. Tuttavia, l'animazione di rotazione, che dovrebbe essere casuale e finisce in una diversa angolazione ogni volta, torna all'immagine originale di CALAyer.Dopo aver ruotato un CALayer usando CABasicAnimation, il livello torna alla sua posizione non ruotata

Voglio che rimanga nell'angolazione finita l'animazione. È possibile? Come lo faccio?

Codice:

//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"]; 

risposta

79

Avete impostato la proprietà removedOnCompletion dell'animazione di rotazione a NO, ad esempio,

rota.removedOnCompletion = NO; 

Questo dovrebbe lasciare lo strato di presentazione in cui si trovava quando l'animazione finito. L'impostazione predefinita è SÌ, che tornerà al valore del modello, ad esempio il comportamento che descrivi.

Il FILLMODE dovrebbe anche essere impostato, cioè,

rota.fillMode = kCAFillModeForwards; 
+0

L'ho fatto. Ho aggiunto il codice che ho usato per la domanda. – Mikle

+9

la cosa fillMode l'ha risolto. Dio solo sa perché è necessario :) – Mikle

+0

@Allan Qualche idea sul perché 'fillMode' deve essere impostato su' kCAFillModeForwards'? – pixelfreak

1

ho scoperto che impostando: removedOnCompletion = NO;

non avrebbero prodotto una perdita visibile in strumenti, ma non ha ottenuto deallocato e stava accumulando un piccolo quantità di memoria. IDK se è la mia implementazione o cosa, ma aggiungendo removeAllAnimations alla fine dell'animazione sembrava cancellare questo piccolo frammento di memoria residua.

[myview.layer removeAllAnimations]; 
+0

È su simulatore o dispositivo? – Pablo

+0

sì, è stato sul simulatore, e non ho provato il dispositivo, che ovviamente è il vero affare. Era un aumento molto piccolo. BUt, ho trovato questa causa che stavo cercando un'altra perdita usando gli strumenti e stavo vedendo uno strano comportamento della memoria. Facendo questo ho isolato la vera perdita che ho avuto, e sono stato in grado di collegare il buco.note questo è xcode 3.2.4 e dopo questo, ho fatto in modo che la memoria tornasse costantemente al suo numero di partenza, il che è bello. – yeahdixon

+1

Si sta animando il livello di presentazione. Quindi si dovrebbe impostare la proprietà 'transform' del livello del modello sul valore finale, ma invece si preserva il livello di presentazione con' removedOnCompletion = NO', quindi, finendo con due strati invece uno. Ecco perché vedi un aumento della memoria. – Jano

4

Stavo provando a ruotare una freccia avanti e indietro, come l'effetto "Pull to Refresh" di Twitter/Facebook.

Il problema è, stavo facendo la rotazione avanti e indietro sullo stesso UIView, quindi dopo aver aggiunto

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

La guerra di animazione in avanti lavorare male, ma l'animazione al contrario, non funzionava affatto.

Così ho aggiunto l'ultima linea suggerita da yeahdixon, e in aggiunta set della vista trasformare allo stato completato il dell'animazione: (rotazione di 180 gradi)

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

Per il 'ripristino' animazione (indietro) I fare questo al completamento:

myView.transform = CGAffineTransformMakeRotation(0); 

... e funziona correttamente. In qualche modo non ha bisogno della chiamata removeAllAnimations.

+0

Riprendendo vecchie risposte, ma +1 per la cosa 'removeAllAnimations'. Ciò mi ha fatto fermare il tremolio. – Cyrille

Problemi correlati