这两个方式的主要差异在于,前者若是不主动设置,那么在动画作完之后,会恢复原状。
后者则不会,动画作完后是什么样,控件就是什么样。程序员
首先咱们来作一个动画工具
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