2012-07-03 81 views
0

我需要在iOS 3.2上實現非常自定義的動畫。因此,在4.0之前,我都不能使用塊動畫或UIKit動畫。我嘗試使用Core Animation。iOS上的CATransaction + UIView 3.2

這裏是我的代碼:

[CATransaction begin]; 
[CATransaction setAnimationDuration: 3.0]; 
[CATransaction setDisableActions: YES]; 
someView.frame = CGRectMake(endX, 0, endWidth, height); 
// a lot of another property changes 
[CATransaction commit]; 

不幸的是,這是行不通的:觀點立即改變大小/不透明度,沒有任何動畫。

這裏是我的嘗試:

  • 我設置新的幀沒有查看,但其層(someView.layer.frame = ...) - 它甚至更糟,因爲來看子視圖並沒有調整。
  • 我將禁用動作選項設置爲YES和NO。

解決方案要求:

  • 的iOS 3.2必須得到支持(沒有塊)。
  • 動畫必須應用於不同的視圖(因此,應用於不同的圖層)。
  • 動畫曲線很困難,所以我不能使用預定義的動畫曲線(或者通過CA語言,MediaTimingFunction)。

回答

0

我不確定這是否是你想要或不是,但你可以使用的UIView動畫

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:3.0]; 
someView.frame = CGRectMake(endX, 0, endWidth, height); 
// a lot of another property changes 
[UIView commitAnimations]; 
+0

動畫曲線太難了,我無法使用UIView動畫方法。我已經更新了該問題並添加了MediaTimingFunction的要求。 – QuickNick

0

如果你只是想有一個自定義定時功能,那麼你可以用一個CABasicAnimation做。您可以創建自定義定時功能(這是一個從(0,0)到(1,1)的貝塞爾曲線,並帶有兩個控制點,您可以指定該功能)

如果這還不夠(如果您需要更多你需要使用一個CAKeyframeAnumation,然後你可以指定任意數量的值(使用values屬性(一個數組))

在這兩種情況下,你都會創建一個動畫對象爲keypath「frame」,並將動畫添加到views層注意顯式動畫化屬性不會更改該值,因此在動畫te幀將返回其原始值之後,除非您同時爲動畫設置了動畫值爲

+0

是的,我已經考慮過使用BasicAnimation,但據我瞭解,它應用於一個圖層。我應該動畫多個視圖。 – QuickNick

+0

您可以使用動畫組在同一圖層上應用多個動畫,但如果要將它們應用於不同的圖層,則需要事務。關於動畫組的好處是您可以對它們進行配置(如設置時間),並將應用於該組中的所有動畫。如果您需要關鍵幀動畫,它將不會很好。也許你可以有一個方法爲你的「to」和「from」值返回合適的數組,並使用它爲所有動畫獲取相同的時間(如果你需要關鍵幀) –

1

您發佈的代碼顯式禁用了動畫。此行是罪魁禍首:

[CATransaction setDisableActions: YES]; 

通過作出這一呼籲,在您的交易進行的所有更改會被立即提交,沒有動畫。擺脫那條線並且變動應該動畫。

如果您需要自定義曲線,您可能需要按照其他人的建議使用CABasicAnimation。事實上,CAAnimation對象只適用於單個圖層,因此您必須創建多個CAAnimation對象。

或者,您應該可以使用CATransaction方法setAnimationTimingFunction,並將其傳遞給您創建的自定義計時函數。請參閱CAMediaTimingFunction類的參考。請特別注意函數functionWithControlPoints ::::,它允許您通過指定描述定時函數的貝塞爾曲線的控制點來創建計時函數。你僅限於一個立方貝塞爾,從0,0開始到1,1結束。雖然我已經看到黑客可以實現更復雜的效果,但對於更復雜的定時功能並沒有直接的支持。