Dopo la rotazione di un CALayer utilizzando CABasicAnimation lo strato ritorna alla sua posizione ruotata
-
21-09-2019 - |
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"];
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];