157 votes

CABasicAnimation réinitialise à la valeur initiale après l'animation est terminée

Je suis la rotation d'un CALayer et d'essayer de l'arrêter dans sa position finale après l'animation est terminée.

Mais après l'animation se termine, il la remet à sa position initiale.

(xcode docs explicitement dire que l'animation ne sera pas de mise à jour de la valeur de la propriété.)

toutes les suggestions sur la manière d'atteindre cet objectif.

301voto

Nilesh Ukey Points 1160

Edit: Voici la réponse, c'est une combinaison de ma réponse et Krishnan.

cabasicanimation.fillMode = kCAFillModeForwards;
cabasicanimation.removedOnCompletion = NO;

La valeur par défaut est kCAFillModeRemoved. (Ce qui est le comportement de la réinitialisation, vous voyez.)

89voto

Leslie Godwin Points 258

Le problème avec removedOnCompletion est l'élément de l'INTERFACE utilisateur ne permet pas l'interaction de l'utilisateur.

J'technique consiste à définir la valeur dans l'animation et la valeur de l'objet. L'animation sera remplissage automatique de la valeur avant qu'il ne commence, et quand elle est retirée va laisser l'objet à son état correct.

// fade in
CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath: @"opacity"];
alphaAnimation.fillMode = kCAFillModeForwards;

alphaAnimation.fromValue = NUM_FLOAT(0);
self.view.layer.opacity = 1;

[self.view.layer addAnimation: alphaAnimation forKey: @"fade"];

16voto

Krishnan Points 4605

Définissez la propriété suivante:

animationObject.removedOnCompletion = NO;

14voto

yageek Points 373

Vous pouvez tout simplement mis la clé d' CABasicAnimation de position lorsque vous l'ajoutez à la couche. En faisant cela, il remplace implicite d'animation réalisé par la poste pour le courant passe dans la course de la boucle.

CGFloat yOffset = 30;
CGPoint endPosition = CGPointMake(someLayer.position.x,someLayer.position.y + yOffset);

someLayer.position = endPosition; // Implicit animation for position

CABasicAnimation * animation =[CABasicAnimation animationWithKeyPath:@"position.y"]; 

animation.fromValue = @(someLayer.position.y);
animation.toValue = @(someLayer.position.y + yOffset);

[someLayer addAnimation:animation forKey:@"position"]; // The explicit animation 'animation' override implicit animation

Vous pouvez avoir plus d'informations sur 2011 Apple de la WWDC Session Vidéo 421 - Core Animation Essentials (milieu de la vidéo)

12voto

msk_sureshkumar Points 89

il suffit de le mettre à l'intérieur de votre code

CAAnimationGroup *theGroup = [CAAnimationGroup animation];

theGroup.fillMode = kCAFillModeForwards;

theGroup.removedOnCompletion = NO;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X