2014-01-12 7 views
0

У меня есть метод экземпляра, который будет выполнять анимацию UIView по свойству shadowOpacity навсегда (никогда не останавливаться).Скажите подпрограмме, что завершена CAAnimation

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

Здесь я просто сделаю простой системный вызов sleep(0.5). Это, безусловно, оставило некоторые проблемы с отображением.

Мой вопрос заключается в том, как реализовать повторную анимацию NO-TIME-GAP здесь?

- (void)animateShadowRepeatly 
{ 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     while (YES) { 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       animation.duration = 0.5; 
       if (_actionTarget2.layer.shadowOpacity <= 0.1) { 
        animation.fromValue = [NSNumber numberWithFloat:0.0]; 
        animation.toValue = [NSNumber numberWithFloat:1.0]; 
        _actionTarget2.layer.shadowOpacity = 1.0; 
       } else { 
        animation.fromValue = [NSNumber numberWithFloat:1.0]; 
        animation.toValue = [NSNumber numberWithFloat:0.0]; 
        _actionTarget2.layer.shadowOpacity = 0.0; 
       } 
       [_actionTarget2.layer addAnimation:animation forKey:@"shadowOpacity"]; 
      }); 
      sleep(0.5);//here I must pasuse the while loop until animation on actionTarget2 finished.I think sleep(0.5) here is not a good implement,How to make an elegant implement for the dependency on animation purpose? 
     } 
    }); 
} 

ответ

0

Нет, вы не можете этого сделать. Сон предотвратит запуск анимации, поскольку он блокирует основной поток. И вы не можете запускать анимацию в фоновом потоке.

Что вы хотите сделать, это настроить себя как делегата анимации и добавить метод завершения. Затем в методе завершения вы запускаете следующую анимацию.

Я написал сообщение здесь О SO Это объясняет, как добавить блок завершения в вашу анимацию и вызвать ЭТО, когда анимация заканчивается. Выезд this link.

+0

благодарит за вашу помощь. Я создаю метод делегата для получения этого события, и внутри него я делаю вызов [self animateShadowRepeatly]. Это работает как мое ожидание. – chenniao

Смежные вопросы