2014-08-29 38 views
0

我正試圖在CALayer上實現自定義屬性的動畫。我已經設置了財產作爲動態的,它主要是工作。在我的應用程序中,我可能會有一個或多個此圖層的實例,所有這些實例都應該同時進行動畫製作。但是,有時當動畫被觸發時,一些圖層不會執行動畫。他們簡單地直接跳到最終值。從CABasicAnimation執行不可靠

在嘗試調試問題時,它看起來像動畫開始時,具有問題的圖層在其動畫屬性的最終值的模型圖層上重繪。剩下的圖層僅在動畫屬性的瞬態值上重繪其表示層。它通常是最後一個有問題的圖層,但有時它是隨機圖層。

它很零星,我不確定接下來要看的地方。

這裏的代碼,觸發動畫片段:

@dynamic aspectModeFraction; 

- (id<CAAction>)actionForKey:(NSString *)key 
{ 
    if ([key isEqualToString:@"aspectModeFraction"]) 
    { 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key]; 
     animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
     animation.fromValue = @([[self presentationLayer] aspectModeFraction]); 
     animation.duration = 2.0f; 
     animation.delegate = self; 
     return animation; 
    } 
    return [super actionForKey:key]; 
} 

+ (BOOL)needsDisplayForKey:(NSString *)key { 

    if ([@"fullRect"   isEqualToString:key]) { return YES; } 
    if ([@"localRect"   isEqualToString:key]) { return YES; } 
    if ([@"screens"   isEqualToString:key]) { return YES; } 
    if ([@"aspectModeFraction" isEqualToString:key]) { return YES; } 

    return [super needsDisplayForKey:key]; 
} 
+0

你是如何要求動畫?根據我的經驗,使用鍵值編碼始終有效。所以如果你說'myLayer.aspectModeFraction = whatever',試着說'[myLayer setValue:whatever forKey:@「aspectModeFraction」]''看看是否有所作爲。 – matt 2014-08-30 05:25:09

回答

0

感謝您的建議。我最終追查了這個問題。我已經優化了繪圖代碼,只在這個參數改變時做一些計算。當參數更新時,我將計算標記爲髒,以便在下一個循環中重新計算它們。髒標誌通過參數上的自定義setter設置。當我切換到@dynamic(這似乎是CAAnimations需要的)時,自定義設置者不得不離開,所以我通過讓對象自己做KVO來更新髒標誌。事實證明,在動畫期間不會調用observeValueForKeyPath:...。它獲得了最終價值的一個更新,但沒有中間體。

無論如何,每次解決問題時都會放棄優化並進行完整的計算。 KVO上的動畫值不像預期的那樣工作似乎是罪魁禍首。

0

看起來你有大部分零部件。自定義屬性動畫中有很多小部件,並且this talk可能仍然有幫助,它看起來像是您可能擁有重要的東西。

我首先懷疑調用代碼。我會確保你沒有壓制動畫,或者修改主線程中的任何UIKit部分。

值得注意的是,使用@dynamic來獲取您的圖層屬性的技巧可能不會被正式支持。 (這是「似乎有用」的東西之一,而不是從我知道的任何文檔中出來;當我和一些蘋果工程師談論這件事時,他們從來沒有聽說過這樣做。如果僅在10.9+以上遇到麻煩,則可以嘗試將@dynamic的使用替換爲您在initWithLayer:中複製的標準屬性。

+0

動畫定製屬性是官方的;有Apple [示例代碼](https://developer.apple.com/library/ios/samplecode/sc2284/Introduction/Intro.html#//apple_ref/doc/uid/DTS40014302),具體說明如何執行此操作。事實上,整個動畫系統都是專門設計的,可以通過這種方式進行擴展。 – matt 2014-08-30 03:41:08

+0

我明白你可以動畫自定義屬性。這是事實@ @動態屬性自動複製,我說的是沒有記錄,可能不會被支持。如果你看看你鏈接的代碼,他們在'initWithLayer:'中實現拷貝,並使用@ dynamic。 (請參閱CustomAnimatableProperty/BulbLayer.m)您並未指出您有'initWithLayer:'方法來處理此問題。 – 2014-08-30 03:56:05