2010-02-12 23 views
3

J'essaye de créer un CAKeyframeAnimation avec un petit twist. Je veux qu'une partie de l'animation de l'image clé boucle pendant un moment avant d'aller directement à la fin. Par exemple:CAKeyframeAnimation avec la boucle

Intro: play keyframes 0 to 10 
Loop: play keyframes 11 to 15 (repeat for a while) 
End: play keyframes 16 to 20 

CAKeyframeAnimation ne semble pas offrir une souplesse suffisante, de sorte que la seule façon que je peux penser à résoudre c'est en fournissant 3 animations distinctes des images clés.

Y at-il une meilleure solution là-bas?

Répondre

2

Puisque personne n'a essayé de répondre à cette question et en supposant que vous ne l'ayez pas encore résolu, j'ai pensé que je lui donnerais un coup de main.

Tout d'abord je voudrais créer une propriété qui stocke l'état de l'animation. à savoir

NSUIneteger animationState; 

qui stocke: 0 = idleState; 1 = startState; 2 = loopedState; 3 = état d'extrémité;

Je voudrais également créer BOOL pour déterminer quand arrêter l'animation en boucle;

BOOL haltAnimation; 

Ensuite, Initialiser le animationState à 0. Lorsque vous commencez l'animation, créez le premier objet CAAnimation et assurez-vous que vous définissez le délégué à l'auto. Initialiser haltAnimation à false;

Dans la méthode animationDidStart (tel que requis par votre mise en œuvre du délégué) ont quelque chose comme ceci:

-(void)animationDidStart { 
    switch(animationState) { 
     case 0: 
      animationState = 1; 
      break; 
     case 1: 
      animationState = 2; 
      break; 
     case 2: 
      if(haltAnimation) 
       animationState = 3; 
    } 
} 

Ensuite, dans votre méthode déléguée d'animation terminé, faire quelque chose comme ceci:

-(void)animationDidFinish { 
    swtich(animationState) { 
     case 1: 
      /*apply stage 2 animation and assign delegate to self*/ 
      break; 
     case 2: 
      if(!haltAnimation) { 
       /*apply stage 2 animation and assign delegate to self*/ 
      } else { 
       /*apply stage 3 animation and assign delegate to self*/ 
      } 
      break; 
     case 3: 
      animationState = 0; 
      break; 
    } 
} 

Alors qu'est-ce arrive, l'animation de l'étape 2 continuera pour une longueur arbitraire jusqu'à ce que vous définissiez haltAnimation à true.

Notez que tout ceci n'a pas été testé et n'a pas été testé. J'invite tout le monde à offrir un meilleur modèle de design.

+0

Merci Nader. J'ai effectivement résolu ce problème avec une solution similaire. Merci d'avoir partagé! –