Après avoir fait tourner un CALayer en utilisant la couche CABasicAnimation saute à sa position non pivotée

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

Question

Je suis en train de créer une pièce de monnaie tombe. L'image de la pièce est un CALayer avec 2 CABasicAnimations sur le sujet - une chute vers le bas et une rotation d'un. Lorsque la chute animation arrive à sa fin, il y reste. L'animation de rotation mais, ce qui est censé être aléatoire et finissent dans un angle différent à chaque fois, apparaît tout juste à l'image CALayer originale.

Je veux rester dans l'angle, il a terminé l'animation sur. C'est possible? Comment puis-je faire?

Code:

//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"];
Était-ce utile?

La solution

Avez-vous défini la propriété removedOnCompletion de l'animation de rotation NO, par exemple.

rota.removedOnCompletion = NO;

Cela devrait laisser la couche de présentation où il était une fois l'animation terminée. La valeur par défaut est OUI, qui passera de nouveau à la valeur de modèle, à savoir le comportement que vous décrivez.

Le fillMode doit également être définie, à savoir,

rota.fillMode = kCAFillModeForwards;

Autres conseils

Je tentais de faire pivoter une flèche en arrière, comme le Twitter / Facebook effet « Pull Actualiser ».

Le problème est, je faisais la rotation avant et en arrière sur la même UIView, donc après avoir ajouté

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

La guerre d'animation avant de travail OK, mais l'animation en arrière ne fonctionnait pas du tout.

J'ajouté la dernière ligne proposée par yeahdixon, et en plus mis à transformer l'état achevé de l'animation de la vue: (rotation de 180 degrés)

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

Pour l'animation 'restauration' (en arrière) Je le fais à la fin:

myView.transform = CGAffineTransformMakeRotation(0);

... et il fonctionne très bien. D'une certaine façon, il n'a pas besoin de l'appel de removeAllAnimations.

Je trouve que par réglage: removedOnCompletion = NO;

n'a pas produit une fuite visible dans les instruments, mais n'a pas obtenu désalloué et accumulait une petite quantité de mémoire. IDK si sa mise en œuvre ma ou quoi, mais en ajoutant removeAllAnimations à la fin de l'animation semblait effacer ce petit peu de mémoire résiduelle.

[myview.layer removeAllAnimations];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top