2011-04-03 65 views
4

我對CoreAnimation不是很熟悉,所以我希望我錯過了一些非常簡單的事情。我想用簡單的方式爲一個NSView設置一個自定義屬性(NSGradient),使用[[view animator] setGradient:gradient];。我定義了+ (id)defaultAnimationForKey:(NSString *)key並返回了一個簡單的CABasicAnimation,但是,沒有執行動畫。由於這適用於更簡單的類型和NSColor,我猜CABasicAnimation不適用於漸變。很好,但在這種特殊情況下,漸變是微不足道的(總是兩次停止),所以我可以輕鬆地編寫插值函數。 問題:如何定義自定義插值?我搜索了關於視圖,圖層和動畫的代表,動畫類的子類等,但我無法弄清楚這些事情。謝謝!CABasicAnimation和自定義類型

+0

你能發表更多的代碼嗎? – Sneakyness 2011-07-28 21:39:33

+0

我能夠解決這個定義兩種顏色而不是漸變的問題。由於NSColor具有動畫效果,因此工作得很好。但是,有關自定義類型的自定義插值的主要問題尚未解答... – Gobra 2011-08-02 09:03:12

回答

1

我以爲我記得當我學習如何使用核心動畫時,通過一些Apple文檔傳遞,該動畫展示瞭如何設置動畫,這些動畫無法由定義動畫提供的屬性describedescript來處理。一路上,我偶然發現了蘋果的一些示例代碼,其描述如下:

顯示單個漸變圖層,並使用新的隨機顏色連續動畫。

這可能是您已經以另一種方式處理的具體任務的答案。我在Xcode的文檔和API參考中找到它,示例代碼的名稱僅爲漸變。 (請注意,原始版本1.0和更新版本1.1在今年4月重做,因此應該更容易與當前工具一起使用。

但是,創建自定義動畫的更大問題不能通過核心動畫本身的自動化,是按照在部分使用的NSAnimation對象從蘋果公司的動畫編程指南可可的例子,它的主題子類NSAnimation和推薦的方法下描述的標題平滑下顯示動畫。您可以覆蓋setCurrentProgress:方法,以便每個一次是叫你先調用Super使NSAnimation更新進度值,即您的自定義動畫屬性,然後做任何更新或繪圖需要爲您的動畫的下一幀。以下是蘋果所引用文檔中提供的說明和示例代碼:

正如提到的「設置和處理進展標誌,」你可以將一系列的進步標誌的一個NSAnimation對象,並有委託執行動畫:didReachProgressMark:在每個進度標記處重繪對象的方法。但是,這不是使對象動畫的最佳方式。除非您設置了大量進度標記(每秒30次或更多),否則動畫可能會顯得不平穩。

更好的方法是繼承NSAnimation並覆蓋setCurrentProgress:方法,如清單4所示。NSAnimation對象在每幀之後調用此方法以更改進度值。通過攔截此消息,您可以執行該框架所需的任何重繪或更新。如果你重寫這個方法,一定要調用super的實現,以便它可以更新當前的進度。

Listing 4 Overriding the setCurrentProgress: method 
- (void)setCurrentProgress:(NSAnimationProgress)progress 
{ 
    // Call super to update the progress value. 
    [super setCurrentProgress:progress]; 

    // Update the window position. 
    NSRect theWinFrame = [[NSApp mainWindow] frame]; 
    NSRect theScreenFrame = [[NSScreen mainScreen] visibleFrame]; 
    theWinFrame.origin.x = progress * 
     (theScreenFrame.size.width - theWinFrame.size.width); 
    [[NSApp mainWindow] setFrame:theWinFrame display:YES animate:YES]; 
} 

所以基本上你定義一個「進步價值」(可能由幾個固定值),它定義您的自定義動畫的狀態,寫,鑑於目前的「進步價值」的代碼繪製或改變什麼畫當動畫處於特定狀態時。然後,讓NSAnimation使用設置動畫的常規方法運行動畫,它將執行您的代碼以在適當的時間繪製動畫的每個幀。

我希望能回答你想知道的東西。我懷疑我之所以能夠通過搜索而沒有看到它,因爲我終於必須去我認爲可能的地方,並且一頁接一頁地瀏覽整個主題以再次找到它!