Dopo la rotazione di un CALayer utilizzando CABasicAnimation lo strato ritorna alla sua posizione ruotata

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

Domanda

Sto cercando di creare una moneta che cade. L'immagine è una moneta CALayer con 2 CABasicAnimations su di esso - un cadere e una rotazione uno. Quando l'animazione che cade arriva alla sua fine, rimane lì. L'animazione di rotazione, però, che si suppone sia casuale e finire in un angolo diverso ogni volta, si apre appena tornato all'immagine CALayer originale.

Voglio che rimanga in un angolo è finito l'animazione su. È possibile? Come posso fare?

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"];
È stato utile?

Soluzione

Avete imposta la proprietà removedOnCompletion dell'animazione di rotazione a NO, per es.,

rota.removedOnCompletion = NO;

Questo dovrebbe lasciare lo strato di presentazione in cui si trovava quando l'animazione finito. L'impostazione predefinita è SI, che si aggancerà al valore del modello, vale a dire, il comportamento che si descrive.

Il FillMode deve essere impostato, cioè,

rota.fillMode = kCAFillModeForwards;

Altri suggerimenti

Stavo cercando di ruotare una freccia avanti e indietro, come il Twitter / Facebook "Pull a Refresh" effetto.

Il problema è che 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 impostare la visualizzazione di trasformazione per lo stato completato il dell'animazione: (rotazione di 180 gradi)

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

Per l'animazione 'ripristinare' (indietro) faccio questo al termine:

myView.transform = CGAffineTransformMakeRotation(0);

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

ho scoperto che impostando: removedOnCompletion = NO;

non ha prodotto una perdita visibile in strumenti, ma non ha ottenuto deallocato e stava accumulando una piccola quantità di memoria. IDK se la mia applicazione o cosa, ma con l'aggiunta di removeAllAnimations alla fine dell'animazione sembrava cancellare questo piccolo po 'di memoria residua.

[myview.layer removeAllAnimations];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top