2010-12-09 36 views
5

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.

Répondre

4

Si vous souhaitez regrouper une série d'animations comme celle-ci, de sorte qu'ils sont garantis à synchroniser, vous pouvez les envelopper dans un CATransaction:

[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:2.0] forKey:kCATransactionAnimationDuration];  

// Do animations 

[CATransaction commit];  

Cependant, je ne suis pas tout à fait sûr pourquoi la le code que vous avez écrit ne déclenche pas les animations correctes pour chaque couche, même si elles n'étaient pas synchronisées.

Notez qu'en définissant removedOnCompletion sur YES, votre animation s'exécutera et l'objet retournera à son point de départ à la fin. Vous voulez probablement que ce soit NON.

+0

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. –

+1

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 –

+0

Je modifie ma question avec les "mises à niveau", même si le problème se produit toujours. –