Поскольку никто не ответил на это и предположил, что вы еще не решили его, я думал, что дам ему удар.
Во-первых, я бы создал свойство, в котором хранится состояние анимации. т.е.
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.
Обратите внимание, что это все непроверено и с манжетой. Я приглашаю кого-нибудь еще предложить лучшую схему дизайна.
Спасибо Nader. Я действительно решил эту проблему с аналогичным решением. Спасибо, что поделился! –