2 votes

<CAKeyframeAnimation répétant la rotation à partir du dernier point>

Dans mon application iPhone, j'ai un UIButton que je fais pivoter de 180 degrés en vue lorsqu'un autre UIButton est pressé, puis lorsque le bouton est de nouveau cliqué, le bouton pivote de nouveau de 180 degrés pour revenir à son point de départ.

Tout fonctionne bien la première fois que le processus complet des 360 degrés se produit, mais si j'essaie de recommencer depuis le début, il tourne de 180 degrés puis essaie de le faire pivoter à partir de ce point. Est-ce que quelqu'un peut me pointer dans la bonne direction? Voici mon code jusqu'à présent...

showAnimation= [CAKeyframeAnimation animationWithKeyPath="transform.rotation"];
                    showAnimation.duration = self.showAnimationDuration;
                    showAnimation.repeatCount = 1;
                    showAnimation.fillMode = kCAFillModeForwards;
                    showAnimation.removedOnCompletion = NO;
                    showAnimation.cumulative = YES;
                    showAnimation.delegate = self;

float currentAngle =[[[rotateMe.layer presentationLayer] valueForKeyPath="transform.rotation.z"] floatValue];

//Faire pivoter de 180 degrés par rapport à la rotation actuelle
showAnimation.values = [NSArray arrayWithObjects=       
                        [NSNumber numberWithFloat:currentAngle],
                        [NSNumber numberWithFloat:currentAngle + (0.5 * M_PI)],
                        [NSNumber numberWithFloat:currentAngle + M_PI], nil];

[rotateMe.layer addAnimation:showAnimation forKey="show"];

À la fin de l'animation, je mets à jour la rotation de transform de rotateMe afin qu'elle devienne utilisable.

- (void)animationDidStop:(CAKeyframeAnimation *)anim finished:(BOOL)flag
{
    float currentAngle =[[[self.layer presentationLayer] valueForKeyPath="transform.rotation.z"] floatValue];

    NSLog="End: %f", currentAngle;
    rotateMe.transform = CGAffineTransformMakeRotation(0);
}

J'ai obtenu l'effet entièrement fonctionnel avec

    [UIView animateWithDuration=1.0f]
        animations:^{
            CGAffineTransform transform = CGAffineTransformRotate(rotateMe.transform, DEGREES_TO_RADIANS(179.999f));
            rotateMe.transform = transform;
        }
     ];

Mais je voudrais rendre l'animation plus complexe, d'où la CAKeyframeAnimation.

8voto

David Rönnqvist Points 25290

Vous pourriez configurer l'animation pour être additive et animer de 0 à 180 degrés si vous avez besoin de toutes les images clés. Si vous n'avez pas besoin des différentes images clés, vous pouvez simplement le faire avec une animation de base et la propriété byValue. La prochaine fois que l'animation est ajoutée, elle tournera de 180 degrés de plus que la rotation actuelle de la vue.

Si vous définissez la valeur réelle dans le rappel du délégué, alors il n'est pas nécessaire de remplir le mode et de ne pas supprimer l'animation à la fin.

CABasicAnimation *showAnimation = [CABasicAnimation animationWithKeyPath="transform.rotation.z"];
showAnimation.byValue = M_PI;
showAnimation.duration = self.showAnimationDuration;
showAnimation.delegate = self;

[rotateMe.layer addAnimation:showAnimation forKey="show"];

ou en utilisant une animation d'image clé (comme expliqué ci-dessus : le rendre additif et animer de 0 à 180 degrés).

CAKeyframeAnimation *showAnimation = [CAKeyframeAnimation animationWithKeyPath="transform.rotation.z"];
showAnimation.additive = YES; // Rendre les valeurs relatives à la valeur actuelle
showAnimation.values = @[0, /*toutes vos valeurs intermédiaires ici...,*/ M_PI];
showAnimation.duration = self.showAnimationDuration;
showAnimation.delegate = self;

[rotateMe.layer addAnimation:showAnimation forKey="show"];

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