关于iOS里的做动画方法的差别与注意事项
CoreAnimation與UIView.animation...
這兩個(gè)方式的主要差別在于,前者如果不主動設(shè)置,那么在動畫做完以后,會恢復(fù)原狀。
后者則不會,動畫做完后是什么樣,控件就是什么樣。
UIView.animation...是什么
首先我們來做一個(gè)動畫
UIView.animate(withDuration: 5, animations: {self.moveView.frame.origin.y += 200 })這個(gè)動畫是讓moveView在Y軸上移動200個(gè)點(diǎn)。
CoreAnimation
使用CA動畫時(shí),主要是使用的CAAnimation的子類(下面簡稱 anim )。
anim 是添加到Layer上的,你可以在layer上訪問添加到該layer的 anim 。好的,現(xiàn)在我們做一個(gè)和上面一樣的Y軸上的位移動畫。
CoreAnimation動畫的注意事項(xiàng)
怎么獲取正在移動時(shí)的位置呢,如果有一個(gè)需求是要拿到實(shí)際運(yùn)動的位置,該怎么辦?
使用 presentation 屬性
在CA動畫里,所有的實(shí)時(shí)狀態(tài)都會反應(yīng)到這個(gè)屬性返回的layer上,本體layer在動畫時(shí)會被 隱藏 !
回過來看UIView.animation...
我們在動畫進(jìn)行時(shí)打印 presentation 的信息,打印的frame信息竟然能夠正確反應(yīng)當(dāng)前控件的位置情況。
我們再打印 animationKeys 信息看看, Optional(["position"]) 。
我想答案已經(jīng)呼之欲出了。 UIView.animation... 使用的是 CoreAnimation 在做動畫,只是細(xì)節(jié)對程序員隱藏了。
兩者的區(qū)別上需要注意的地方
但是還有一個(gè)問題,剛才的打印結(jié)果,_UIView.animation..._ 結(jié)束后,frame信息為 (155.0, 340.0, 64.0, 64.0) ,而 anim 結(jié)束后為 (155.0, 140.0, 64.0, 64.0) ,但是 anim 的 presentation 的frame卻是正確的。
這意味著你如果要在 anim 動畫后讓控件移動到正確的位置,你需要把控件的frame也設(shè)置到正確到位置,而不只是在 anim 上設(shè)置。
那什么時(shí)候設(shè)置是一個(gè)正確到時(shí)機(jī)呢?我們注意到,在開始做動畫到時(shí)候,屏幕上現(xiàn)實(shí)的視圖,實(shí)際上是顯示的 presentation 的信息,而不依賴于控件本身的layer。所以在做動畫前后都能去設(shè)置控件本身到正確的屬性。
總結(jié)
以上是生活随笔為你收集整理的关于iOS里的做动画方法的差别与注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注册登录页面代码用js判断是否填入信息_
- 下一篇: npm run dev 在本地调试出现跨