2011-02-08 15 views
5

這裏是我的動畫代碼:CATransformLayer不支持隱式動畫?

CGFloat zDistance = 850; 
CGFloat scaleFactor = BACK_COVER_WIDTH/self.transformLayer.bounds.size.width; 
CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0); 
CATransform3D scale = CATransform3DMakeScale(scaleFactor, scaleFactor, 0.0); 
CATransform3D transform = CATransform3DConcat(rotation, scale); 
transform.m34 = 1.0/-zDistance; 
CGPoint location = CGPointMake(CGRectGetMidX(self.layer.frame), CGRectGetMidY(self.layer.frame)); 
[CATransaction begin]; 
[CATransaction setAnimationDuration:1.0]; 
self.transformLayer.transform = transform; 
self.transformLayer.position = location; 
[CATransaction commit]; 

self.transformLayerCATransformLayer有兩個子層,一個正面和一個背面(我創建一個「炫」的效果)。但是,這段代碼只是設置了位置並且沒有動畫就進行了轉換所以我認爲可能transform不支持隱式動畫,所以我把它拿出來,試着設置位置,但是沒有動畫(我知道position支持隱式動畫)。

我做錯了什麼或者CATransformLayer只是不支持隱式動畫?文檔沒有說明它不支持它,所以我假設它。

編輯:這是Mac OS X,iOS的不

+0

您是否嘗試過使用顯式動畫? – 2011-02-11 01:18:08

回答

1

我最終只使用了顯式動畫,但大衛鄧肯的回答here對於遇到此問題的其他人來說似乎是朝着正確方向邁出的一步。

0

隱動畫是與UIView伴生的所有圖層禁用。如果您對細節感興趣,我還有另一個問題detailed response。但簡而言之,如果要在與視圖關聯的圖層上創建動畫,則需要明確執行動畫(即使用-addAnimation:forKey:附加CAAnimation對象)。

編輯:事實證明,這個問題是針對OS X的,而CATransformLayer實際上是一個子層。請忽略此答案(儘管鏈接的答案對iOS仍然有用)。

+0

這不適用於iOS,適用於Mac OS X.我應該在我的文章中更加清楚。變換圖層是視圖圖層的子圖層(視圖是圖層託管視圖)。 – indragie 2011-02-08 05:33:17

+0

啊哈。在那種情況下,我不知道。抱歉。 – 2011-02-08 05:41:34

0

只呈現CATransformLayer的子圖層。所以我的猜測是它的transform屬性永遠不會被應用。你有嘗試設置sublayerTransform屬性嗎?無論如何,這似乎就是你要做的。

0

如果添加圖層並嘗試在同一個運行循環中對其進行動畫處理,則動畫將不會發生 - 它會立即生成。您需要在CATransaction中添加圖層。之後,您可以隱式或顯式地設置動畫。例如,這應該工作:

[CATransaction begin]; 
[self.view.layer addSublayer:transformLayer]; 
[CATransaction commit]; 

// implicit animation will now occur because we're in the next run loop 
transformLayer.transform = newTransform;