2013-04-24 78 views
1

我對iOS動畫並沒有太多的瞭解。我試圖實現的是一個簡單的消息視圖,從屏幕底部垂直滑動到給定的y,然後在幾秒鐘之後UIView會以垂直方式回滾到屏幕外。UIView動畫停止時UIView將會消失

[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看到,「已完成」完成是「假的」。因此第二個塊不被調用,並且消息視圖保持打開狀態。

這裏有幾個問題:

  • 我首先關心的是要了解,如果我寫的代碼是正確的,對於嵌套的動畫。
  • 我可以通過忽略'finished'和執行代碼來解決,但我不覺得這是一個好主意,在最後一個完成塊內,我已經放了一些編程邏輯,基本上我正在恢復一些UIButtons狀態,以及其他一些小UI的變化。在這一點上,我不知道這是不是一個好主意,但似乎沒有,但如何讓UI知道消息視圖已經消失。當涉及快速響應的UI更改時,NSNotification和KVO似乎是一個糟糕的主意。
+0

我的建議是創建SimpleMessageViewDelegate協議,其具有 - (無效)messageFinished(或類似的東西),其被稱爲在消息呈現結束時恢復UI方法。 你也可以在messageFinished的末尾設置要執行的塊,從而跳過協議,並在視圖中呈現消息的不需要的方法。 – 2013-04-24 08:54:22

回答

-2

您可以通過向圖層發送removeAllAnimations消息來停止圖層的所有動畫。

[sel.view removeAllAnimations]; 
+2

它應該是'self.layer removeAllAnimations]' – Chaikitty 2016-08-03 01:02:32