關於iOS裏的作動畫方法的差異與注意事項

CoreAnimation與UIView.animation...

這兩個方式的主要差異在於,前者若是不主動設置,那麼在動畫作完之後,會恢復原狀。
後者則不會,動畫作完後是什麼樣,控件就是什麼樣。程序員

UIView.animation...是什麼

首先咱們來作一個動畫工具

UIView.animate(withDuration: 5, animations: {
    self.moveView.frame.origin.y += 200
})

這個動畫是讓moveView在Y軸上移動200個點。動畫

  1. 咱們在動畫代碼前,打印一下這個控件的frame信息 (155.0, 140.0, 64.0, 64.0)
  2. 而後咱們在動畫開始2秒和動畫結束時打印一下frame信息,讓人疑惑的是結果都爲 (155.0, 340.0, 64.0, 64.0)
  3. 咱們先停一下,去看看CoreAnimation

CoreAnimation

使用CA動畫時,主要是使用的CAAnimation的子類(下面簡稱 anim )。
anim 是添加到Layer上的,你能夠在layer上訪問添加到該layer的 anim 。好的,如今咱們作一個和上面同樣的Y軸上的位移動畫。調試

  1. 在動畫開始後的2秒打印一下frame和layer.frame信息,都是 (155.0, 140.0, 64.0, 64.0)
  2. 在2秒時打印animationKeys, Optional(["position"])
  3. 動畫結束後,控件恢復到了原狀,animationKeys爲 nil
  4. 咱們把anim改爲動畫結束後保持結束時狀態再看看1-3點的信息
  5. frame和layer.frame信息,也還都是 (155.0, 140.0, 64.0, 64.0)
  6. 在2秒時打印animationKeys, Optional(["position"])
  7. 動畫結束後,控件恢復到了原狀,animationKeys爲 Optional(["position"])
  8. 此時咱們使用Xcode的視圖調試工具查看,控件位置在 (155.0, 140.0, 64.0, 64.0) ,而且調試界面的位置和APP上的位置徹底不同。

CoreAnimation動畫的注意事項

怎麼獲取正在移動時的位置呢,若是有一個需求是要拿到實際運動的位置,該怎麼辦?
使用 presentation 屬性
在CA動畫裏,全部的實時狀態都會反應到這個屬性返回的layer上,本體layer在動畫時會被 隱藏 !code

  1. 如今咱們根據剛纔的 anim 動畫查看一下 presentation 的信息。
  2. 果真,控件位置的實時信息是反應在這個layer上的

回過來看UIView.animation...

咱們在動畫進行時打印 presentation 的信息,打印的frame信息居然可以正確反應當前控件的位置狀況。
咱們再打印 animationKeys 信息看看, Optional(["position"])
我想答案已經呼之欲出了。 UIView.animation... 使用的是 CoreAnimation 在作動畫,只是細節對程序員隱藏了。animation

二者的區別上須要注意的地方

可是還有一個問題,剛纔的打印結果,_UIView.animation..._ 結束後,frame信息爲 (155.0, 340.0, 64.0, 64.0) ,而 anim 結束後爲 (155.0, 140.0, 64.0, 64.0) ,可是 animpresentation 的frame倒是正確的。
這意味着你若是要在 anim 動畫後讓控件移動到正確的位置,你須要把控件的frame也設置到正確到位置,而不僅是在 anim 上設置。
那何時設置是一個正確到時機呢?咱們注意到,在開始作動畫到時候,屏幕上現實的視圖,其實是顯示的 presentation 的信息,而不依賴於控件自己的layer。因此在作動畫先後都能去設置控件自己到正確的屬性。it

相關文章
相關標籤/搜索