2008-10-28 89 views
8

核心動畫允許自定義動畫通過實現您的CALayer基於類的actionForKey方法:如何在Core Animation中使用onOrderOut的自定義動畫?

- (id<CAAction>)actionForKey:(NSString *)key { 
    // Custom animations 
    return [super actionForKey:key]; 
} 

然後我就可以創建一個動畫,並返回其爲onOrderIn動作(即當圖層添加到另一層) 。這工作得很好。如果我對onOrderOut執行相同操作(即,該層從其超級層上移除),則返回的動畫將被忽略,並且會應用默認動畫。

我的目標是,以放大層(onOrderIn)和出(onOrderOut):

- (id<CAAction>)actionForKey:(NSString *)key { 

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     a.duration = 0.25; 
     a.removedOnCompletion = NO; 
     a.fillMode = kCAFillModeBoth; 

     if ([key isEqualToString:@"onOrderIn"]) { 
      a.fromValue = [NSNumber numberWithFloat:0.0]; 
      a.toValue = [NSNumber numberWithFloat:1.0]; 
     } else { 
      a.fromValue = [NSNumber numberWithFloat:1.0]; 
      a.toValue = [NSNumber numberWithFloat:0.0]; 
     } 

     return a; 
    } 

    return [super actionForKey:key]; 
} 

在作品放大,縮小不。相反,使用默認的淡出動畫。

該代碼可能包含一些拼寫錯誤,因爲我在另一臺機器上輸入了該錯誤。

任何人都可以幫忙嗎?

回答

4

quartz-dev mailing list引用約翰·哈珀:

有與 一個根本問題,通過關鍵的 動畫應該運行的時間返回任何動畫的 onOrderOut,層 不再在樹,所以它沒有 的影響。所以onOrderOut對於觸發動畫沒有用 ;當從樹中刪除 圖層時,它可能是 對於運行其他代碼很有用。

我發現這個 的最佳解決方案(假設父默認淡出過渡 是不是你想要的, 它往往是不)是添加自定義動畫 申請的去除效果 然後,在didStop 動畫代理中,實際刪除 這一層。這是很方便的 創建動畫 與委託財產集合的一個組,並 在fillMode =前鋒, removedOnCompletion = NO,這樣就可以 在 動畫與沒有 層的可能性到底去除層仍然在其正常狀態下顯示在其 。

如果你做很多這樣的情況下,很容易編寫一個啓動動畫的通用超,將動畫委託類和工具+ animationDidStop:去除層W/O動畫啓用。這恢復了CoreAnimation的Fire&For-Forgot特性,您希望在缺省實現中呈現CoreAnimation。

+0

啊,謝謝。我會測試這個,如果我再次需要它,意思是我們用Qt Jambi編寫了一個完全不同版本的軟件。 ;) – Lemming 2009-11-06 22:20:01

0

您是否驗證過您的方法正在以key作爲@"onOrderOut"調用,並且您的方法正在返回正確的動畫?

+0

是的。在實際的代碼中,我首先用動作的名稱調用NSLog,事實上,onOrderOut被請求。我還確保動畫是創建並返回的,但仍然被忽略。 – Lemming 2008-10-31 15:23:23

相關問題