2009-07-24 95 views

回答

6

iPhone支持隱式動畫,雖然它不使用animator對象,但它直接構建到UIView中。試試這個:

[UIView beginAnimations:nil context:nil]; 
[aView setFrame:NSMakeRect(100.0,100.0,300.0,300.0)]; 
[UIView commitAnimations]; 

確切的細節記錄在here

每個視圖都始終支持層,所以您不必打開圖層以獲取顯式動畫的圖層。

+0

這不是一個明確的動畫?或者有什麼不同? – Thanks 2009-07-24 16:31:02

+1

否。顯式動畫是當您直接使用CoreAnimation並將CAAnimations附加到圖層時。隱式動畫是當你設置一些關於動畫的參數時,但除此之外,只需在視圖上設置普通屬性並讓系統爲你製作動畫。在桌面上,隱式動畫是通過代理轉發所有NSView完成的,UIView知道如何在不使用代理的情況下處理它,你只需告訴它你希望它通過類方法構造隱式動畫。 – 2009-07-24 17:28:50

+0

路易斯,你是我的英雄! – 2011-01-20 17:46:50

6

原來iPhone OS確實支持在Apple的Core Animation Programming Guide中定義的CALayer上的隱式動畫。

[view setWantsLayer:YES]; 

在iPhone OS,只需將層代表到的UIViewController派生類承載的UIView派生的對象,你想:在Mac OS X,當它通過設置備份的一個NSView一個層變成動畫動畫。例如,如果您有一個爲稱爲標籤的UILabel定義的屬性,則在託管它的UIViewController派生類中,代碼將如下所示(UIButton Touch Up Inside事件的事件處理程序示例):

-(void) buttonPressedToAnimateTheLabel:(id)sender 
{ 
    CALayer *labelLayer = self.label.layer; 

    labelLayer.delegate = self; 

    layer.position = CGPointMake(labelLayer.position.x, labelLayer.position.y + 50); 
} 

然後只需通過更改位置,標籤就會以與在Mac OS X上完全相同的方式進行動畫製作。

關於這個的一些注意事項:

  1. 絕對是 的UIViewController那是 代表,而不是UIView的。製作 UIView委託導致應用程序 炸燬。

  2. 委託需要在一個稱爲 方法要設置的 的UIViewController派生的類具有 完全完成裝載,即在後爲 由類託管的控制 事件處理程序。我嘗試在initWithNibName:bundle: 中添加 它awakeFromNib,viewDidLoad和 viewWillAppear:動畫,它沒有工作 。在 中設置代理,前兩種方法導致 標籤不生成動畫;它只是 立即改變位置。 在最後兩個中添加它會導致 標籤完全消失。委託是在 事件處理程序設置一次

  3. 後,這將有利於 的的 的UIViewController派生類的壽命的剩餘部分。 更改 其他事件處理程序中的圖層屬性將使其 生成動畫,而無需再次爲該圖層設置 委託。

    時的UIViewController派生類失去焦點
  4. ,委託必須設置爲零的viewWillDisappear:動畫的方法,否則應用程序將炸燬

必須有一些地方設置只委託一次,所以它不會被設置多次作爲一個事件處理程序被調用的結果,但我還沒有找到那個地方。至少它以這種方式工作並多次設置,因爲多次調用事件處理程序似乎是無害的。

如果將它全部記錄在Core Animation Programming Guide中,那肯定會很好。我花了好幾天的時間來解決這個問題!希望這可以節省尋找它的所有麻煩!

+0

我在添加委託之前遇到了與圖層不相同的問題(只是跳躍)。不過,我(至少在iPad上爲3.2)能夠在viewDidLoad()方法中設置委託,並且它可以正常工作。 – 2010-07-08 15:22:17

+0

我無法得到這個工作,但它顯示了承諾。我非常想知道更多關於此的信息,因爲無時無刻不得不設置動畫塊。 – 2011-04-15 07:42:39