2014-08-12 3 views
1

У меня есть этот метод в UIViewController, чтобы отобразить сообщение в течение трех секунд, а затем исчезнуть. mainMessageLabel - это UILabel, указанный в файле интерфейса.Остановка анимацииWithDuration до завершения

- (void) showTempMessage: (NSString*) message 
{ 
    _mainMessageLabel.text = message; 
    _mainMessageLabel.alpha = 1; 

    [UIView animateWithDuration: 1 
          delay: 3 
         options: 0 
        animations: ^{ 
         _mainMessageLabel.alpha = 0; 
        } 
        completion: ^(BOOL finished) { 
         _mainMessageLabel.text = @""; 
         _mainMessageLabel.alpha = 1; 
        }]; 
} 

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

Я попытался ответы на другие вопросы здесь, например, добавление UIViewAnimationOptionBeginFromCurrentState к options:, и даже добавление [_mainMessageLabel.layer removeAllAnimations] к началу моей функции, но ничего не работает. Есть ли у вас какие-либо предложения?

ответ

1

Проблема заключается в сроках завершения блока (что он срабатывает после того, как код, который отменяет предыдущую анимацию и сбрасывает метку). Простое решение состоит в том, чтобы просто полностью исключить этот блок завершения (оставляя его с альфой нуля, неотличим от установки text до @"" и делает его «видимым»). Таким образом:

_mainMessageLabel.text = message; 
_mainMessageLabel.alpha = 1.0; 

[UIView animateWithDuration:1 delay:3 options:0 animations:^{ 
    _mainMessageLabel.alpha = 0.0; 
} completion:nil]; 
+0

Я получил его для работы с использованием первого метода удаления блока завершения, но без beginFromCurrentState. – user3770280

+0

Согласен. Учитывая характер анимации, начало с текущего состояния не имеет значения (и с iOS 8 мы больше не будем использовать «начать с текущего состояния», во всяком случае). Я на самом деле собираюсь удалить эту чудовищность второго подхода, опасаясь, что кто-то может это сделать в своем производственном коде! – Rob

0

попробовать, как этот

- (void) showTempMessage: (NSString*) message 
{ 
    _mainMessageLabel.text = message; 
    _mainMessageLabel.alpha = 1; 

    [UIView animateWithDuration: 3 
          delay: 0 
         options: 0 
        animations: ^{ 
         _mainMessageLabel.alpha = 1; 
        } 
        completion: ^(BOOL finished) 
        { 
         _mainMessageLabel.text = @""; 
         _mainMessageLabel.alpha = 0; 
        }]; 
} 
0

Просто замените код с этим:

-(void) showTempMessage: (NSString*) message 
{ 

    _mainMessageLabel.text = message; 
    _mainMessageLabel.alpha = 1; 

    [UIView animateWithDuration: 1 
          delay: 3 
         options: 0 
        animations: ^{ 
         _mainMessageLabel.alpha = 0; 
        } 
        completion: ^(BOOL finished) { 
        }]; 
} 

И откуда эта функция вызова просто добавьте следующую строку перед этим.

 [_mainMessageLabel.layer removeAllAnimations]; 
0

Это происходит потому, что ваши UIView анимации становится выполняется в блоке и поскольку блок функции выполняются в другом потоке вы не могли остановить его в основном потоке.

How to fadein and fadeout in single UIView?

вы можете посмотреть, чтобы это другой способ делать анимацию. Это поможет вам остановить и начать анимацию по вашему желанию.

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