這兩個方式的主要差異在於,前者若是不主動設置,那麼在動畫作完之後,會恢復原狀。
後者則不會,動畫作完後是什麼樣,控件就是什麼樣。程序員
首先咱們來作一個動畫工具
UIView.animate(withDuration: 5, animations: { self.moveView.frame.origin.y += 200 })
這個動畫是讓moveView在Y軸上移動200個點。動畫
使用CA動畫時,主要是使用的CAAnimation的子類(下面簡稱 anim )。
anim 是添加到Layer上的,你能夠在layer上訪問添加到該layer的 anim 。好的,如今咱們作一個和上面同樣的Y軸上的位移動畫。調試
怎麼獲取正在移動時的位置呢,若是有一個需求是要拿到實際運動的位置,該怎麼辦?
使用 presentation 屬性
在CA動畫裏,全部的實時狀態都會反應到這個屬性返回的layer上,本體layer在動畫時會被 隱藏 !code
咱們在動畫進行時打印 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) ,可是 anim 的 presentation 的frame倒是正確的。
這意味着你若是要在 anim 動畫後讓控件移動到正確的位置,你須要把控件的frame也設置到正確到位置,而不僅是在 anim 上設置。
那何時設置是一個正確到時機呢?咱們注意到,在開始作動畫到時候,屏幕上現實的視圖,其實是顯示的 presentation 的信息,而不依賴於控件自己的layer。因此在作動畫先後都能去設置控件自己到正確的屬性。it