2011-04-02 50 views
36

有什麼方法可以判斷UIView是否在動畫中間?當我打印出來的視圖對象,而它正在我注意到有一個「動畫」條目:測試UIView是否在動畫中間

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; animations = { position=<CABasicAnimation: 0x6a69c40>; bounds=<CABasicAnimation: 0x6a6d4d0>; }; layer = <CALayer: 0x2e6e00>> 

當動畫已經停止,我打印的觀點,「動畫」條目現在已經沒有了:

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; layer = <CALayer: 0x2e6e00>> 

回答

36

UIView有一層(CALayer)。您可以發送animationKeys給它,它會給你一個鍵數組,標識連接到圖層的動畫。我想,如果有任何條目,動畫(S)正在運行。如果你想深入挖掘一下CALayer採用的CAMediaTiming protocol。它會提供更多有關當前動畫的信息。

+2

不工作... animationKeys數組總是空的... – Martin 2012-02-10 10:06:24

+0

@Martin對不起,我不能說,當時我給出了它的工作原理。也許自iOS 4.x以來有所改變? – 2012-02-10 12:55:13

+1

@Martin它不起作用,如果你用零鍵發射動畫。 animationKeys不是動畫數組,而是數組的鍵。 – 2013-01-18 13:37:23

24

動畫附着在事實基礎核心動畫CALayer

所以我認爲你可以只檢查myView.layer.animationKeys

+0

animationKeys是一種方法。所以你必須調用[myView.layer animationKeys] – Martin 2012-02-10 10:00:05

+12

animationKeys是一條消息,就像任何屬性訪問器是...點或括號一樣,只是* style *的問題。 – 2012-02-10 10:13:58

+0

但動畫密鑰是*不*屬性! https://developer.apple.com/library/IOs/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html(當然,它不是非常重要:)) – Martin 2012-02-13 08:52:16

5

建議有一個與animationKeys招順利,您可以查詢表示層。

動畫完成後,有時可能會有一些動畫鍵徘徊不前。

這意味着非動畫層可能會返回一組動畫密鑰,即使它並非實際動畫。

您可以通過將動畫的removedOnCompletion屬性設置爲YES來確保自動刪除動畫鍵。

例如

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"aPath"]; 
animation.removedOnCompletion = YES; 

如果你這樣做了一切,您對層的動畫,這將確保當層沒有動畫,沒有存在animationKeys。

7

我不確定問題的背景,但我曾試圖在開始第二個動畫之前查看視圖是否爲動畫,以避免跳過。然而,有一個UIView動畫選項UIViewAnimationOptionBeginFromCurrentState,如果需要,它將結合動畫,以提供平滑的外觀。從而消除我需要知道視圖是否具有動畫效果。

5

其中一些沒有爲我工作。原因是這些動畫是異步的。

我所做的是在我的動畫

[UIView animateWithDuration:0.25 
       animations:^{ 
        viewIsAnimating = YES; 
       } completion:^(BOOL finished) { 
        if (finished) { 
         viewIsAnimating = NO; 
        } 
       }]; 
+0

我的UIButtons的animationKeys屬性總是返回零(即使是動畫),所以我也走這條路去完成工作。 – vikzilla 2016-02-14 15:44:19

+0

如果我使用「.repeat」選項會發生什麼? – 2017-10-05 06:53:29

1

的iOS 9+方法,定義的屬性

@property BOOL viewIsAnimating; 

和作品,即使layer.animationKeys不包含任何鍵:

let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0 

來自文檔:

如果在UIView動畫塊中調用,此方法只返回一個非零值。