Как реализовать animationdidstop

Добрый вечер!

У меня есть кусок кода, но он не вызывает метод animationdidstop. Я не мог определить, почему это не работает. Я пробовал много решений ..

-(IBAction)MakeCircle:(id)sender{

 // Add to parent layer
[self.view.layer addSublayer:circle];

// Configure animation
drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
drawAnimation.duration            = 5.0; 
drawAnimation.repeatCount         = 1.0;  
drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
drawAnimation.toValue   = [NSNumber numberWithFloat:1.0f];
drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

// Add the animation
[circle addAnimation:drawAnimation forKey:@"drawCircleAnimation"];}


-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

if(anim == [self.view.layer animationForKey:@"drawCircleAnimation"]){
    Label.text = [NSString stringWithFormat:@"Loser"];
}

}

Спасибо!!


person Sérgio    schedule 10.03.2015    source источник


Ответы (1)


Вы не ставите себя делегатом анимации. Добавьте эту строку перед добавлением анимации:

drawAnimation.delegate = self;

Редактировать:

Ой. Я точно знаю, в чем проблема. Система копирует ваш объект анимации при отправке анимации, поэтому в подпрограмме завершения это не будет тот же объект. Попробуйте добавить уникальный ключ к анимации и проверить его вместо того, чтобы проверять, является ли это тем же самым объектом анимации, который вы отправили.

e.g.:

drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
[drawAnimation setValue: @"mydrawCircleAnimation" forKey: @"animationKey"];
//The rest of your animation code...

Затем в вашем animationDidStop:

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
  if([anim valueForKey: @"animationKey" 
    isEqualToString: @"mydrawCircleAnimation"])
  {
      Label.text = [NSString stringWithFormat:@"Loser"];
  }
}

Редактировать # 2:

Есть еще более чистый способ обработки кода завершения анимации. Вы можете прикрепить блок к своей анимации, а затем написать общий метод animationDidStop: Завершение:, который ищет блок и вызывает его, если он найден. Смотрите мой ответ в этой теме:

Как определить CAAnimation в делегате animationDidStop?

person Duncan C    schedule 10.03.2015
comment
Вы пробовали добавить оператор журнала в свой метод animationDidStop: finished:? - person Duncan C; 10.03.2015
comment
Хороший!! Это работает ... что-то не так с оператором IF ... любая идея? - person Sérgio; 10.03.2015
comment
Смотрите мои правки. Мне следовало более внимательно присмотреться к вашему методу завершения. - person Duncan C; 10.03.2015
comment
Оператор if не работает no visible @interface. - person Sérgio; 11.03.2015