Quelqu'un peut-il maintenant comment puis-je animer plusieurs couches en même temps en utilisant CAKeyframeAnimation? Chaque couche possède son propre objet CAKeyframeAnimation. Jetez un oeil sur le code ci-dessous:Plusieurs CAKeyframeAnimation dans différentes couches en même temps
J'ai une méthode qui reçoit un objet, crée le CAKeyframeAnimation et se fixe l'animation à elle:
- (void)animateMovingObject:(CALayer*)obj
fromPosition:(CGPoint)startPosition
toPosition:(CGPoint)endPosition
duration:(NSTimeInterval)duration {
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
//pathAnimation.fillMode = kkCAFillModeRemoved; // default
//pathAnimation.removedOnCompletion = YES; // default
pathAnimation.duration = duration;
// create an empty mutable path
CGMutablePathRef curvedPath = CGPathCreateMutable();
// set the starting point of the path
CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y);
CGPathAddCurveToPoint(curvedPath, NULL,
startPosition.x, endPosition.y,
startPosition.x, endPosition.y,
endPosition.x, endPosition.y);
pathAnimation.path = curvedPath;
[obj addAnimation:pathAnimation forKey:@"pathAnimation"];
CGPathRelease(curvedPath);
}
Maintenant, supposons que je 3 couches ajoutées en tant que sous-couche mon jeu de plateau et je fais les appels suivants:
CALayer obj1 = ... // set up layer and add as sublayer
[self animateMovingObject:obj1
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(100.0, 100.0)
duration:2.0];
CALayer obj2 = ... // set up layer and add as sublayer
[self animateMovingObject:obj2
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(150.0, 100.0)
duration:2.0];
CALayer obj3 = ... // set up layer and add as sublayer
[self animateMovingObject:obj3
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(200.0, 100.0)
duration:2.0];
en faisant cela, je ne vois que le obj3
être déplacé de la position (0,0, 0,0) à (200,0, 100,0). Qu'est-ce qui me manque? Dois-je utiliser NSOperationQueue/Threads? L'utilisation de la méthode de délégué animationDidStart:
de CAKeyframeAnimation ne semble pas utile dans ce contexte.
Des idées?
Merci d'avance.
Merci d'avoir répondu Brad. Bien que la position de début/fin de l'animation ne soit pas mon problème, vous avez fait de belles observations. Dans mon cas, j'avais suppriméOnCompletion = YES de manière redondante (c'est la valeur par défaut). Mes étapes concernant ceci sont: 1) placer la position de couche à sa position finale; 2) calculer séparément la position de départ/fin de l'animation (dans laquelle la position finale de l'animation est la position actuelle de la couche). J'ai également laissé 'fillMode' à sa valeur par défaut (kCAFillModeRemoved). Mon problème n'est pas la position des calques pendant/après les animations, il s'agit d'animations séquentielles. –
Si je mets la propriété delegate des trois animations, je remarque dans le rappel de délégué 'animationDidStop: finished:' que les 2 premières animations appellent cette méthode avec l'argument 'finished = NO', et le dernier (qui correspond au couche que je vois être animée) get 'fini = OUI'. Cela a du sens pour ce que je vois, mais je me demande ce qui arrête mes animations. Je n'appelle aucune méthode 'stop' dans mon code, j'appelle simplement les méthodes 'animateMovingObject: ..' trois fois séquentiellement. Merci –
Je modifie ma question avec les "mises à niveau", même si le problème se produit toujours. –