2013-04-24 1 views
1

Я не очень люблю анимацию iOS. То, что я пытаюсь достичь, - это простое представление сообщения, которое сдвигает вертикаль снизу экрана до заданного y, а затем через несколько мгновений откат UIView по вертикали, чтобы выйти из экрана.Остановка анимации UIView, когда UIView willDisappear

[UIView animateWithDuration:0.5f 
       animations:^{ 
        self.messageView.frame=CGRectMake(x, y -80, width, height); 
       } 

       completion:^(BOOL finished){ 
        if (finished) { 

         [UIView animateWithDuration:0.5f delay:2.0f options:UIViewAnimationOptionCurveLinear 
              animations:^{ 
               self.messageView.frame=CGRectMake(x, y + 80, width, height); 
              } 

              completion:^(BOOL finished){ 
               // do something... 
              } 
          ]; 
        } 
       } ]; 

Это работает хорошо, но у меня возникли проблемы с использованием этого механизма в приложении IOS UITabBar: когда я изменить вкладку, анимация стоп, я могу Infact видеть, что «закончили» завершение «ложно». Поэтому второй блок не вызывается, и просмотр сообщения остается включенным.

Вот вопросы:

  • моя первая забота, чтобы понять, если код, который я написал правильно, относительно вложенной анимации.
  • Я мог бы решить, проигнорировав «законченный» и выполнив код в любом случае, но я не чувствую, что это хорошая идея.
  • В последнем блоке завершения я поставил некоторую логику программирования, в основном я восстанавливаю несколько состояний UIButtons , и некоторые другие небольшие изменения пользовательского интерфейса. На данный момент я не знаю, хорошая ли это идея, похоже, нет, но как может пользовательский интерфейс знает, что представление сообщения исчезло. NSNotification и KVO кажутся плохой идеей, когда речь идет о быстрых изменениях пользовательского интерфейса.
+0

Мое предложение заключается в создании SimpleMessageViewDelegate протокол, который имеет - (Недействительными) messageFinished (или что-то подобное) метод, который называется в конце презентации сообщения для восстановления пользовательского интерфейса. Вы также можете пойти с настройкой блока, который будет выполнен в конце messageFinished, тем самым пропустив протокол и ненужные методы, представляющие сообщение. –

ответ

-2

Вы можете остановить все анимации для слоя, отправив слой сообщение removeAllAnimations.

[sel.view removeAllAnimations]; 
+2

Это должно быть 'self.layer removeAllAnimations]' – Chaikitty