2010-02-12 2 views
3

Я пытаюсь создать CAKeyframeAnimation с небольшим завихрением. Я хочу, чтобы часть анимации ключевого кадра зацикливалась на некоторое время, прежде чем идти прямо до конца. Например:CAKeyframeAnimation with loop

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

CAKeyframeAnimation, кажется, не обеспечивают достаточную гибкость, так что единственный способ, которым я могу думать о решении этого является предоставление 3 различных ключевых кадров анимации.

Есть ли лучшее решение там?

ответ

2

Поскольку никто не ответил на это и предположил, что вы еще не решили его, я думал, что дам ему удар.

Во-первых, я бы создал свойство, в котором хранится состояние анимации. т.е.

NSUIneteger animationState; 

, который хранит: 0 = idleState; 1 = startState; 2 = loopedState; 3 = endState;

Я бы также создал BOOL для определения, когда нужно остановить циклическую анимацию;

BOOL haltAnimation; 

Тогда инициализацию animationState 0. Когда вы начинаете анимацию, создать первый объект CAAnimation и убедитесь, что вы установить делегат самостоятельно. Инициализировать haltAnimation для false;

В вашем методе animationDidStart (в соответствии с требованиями вашей реализации делегата) есть что-то вроде этого:

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

Затем в анимации закончил метод делегата, сделать что-то вроде этого:

-(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; 
    } 
} 

Тогда что происходит, анимация этапа 2 будет продолжаться до произвольной длины, пока вы не установите haltAnimation на true.

Обратите внимание, что это все непроверено и с манжетой. Я приглашаю кого-нибудь еще предложить лучшую схему дизайна.

+0

Спасибо Nader. Я действительно решил эту проблему с аналогичным решением. Спасибо, что поделился! –