在一段時(shí)間內(nèi)顯示的內(nèi)容發(fā)生變化,這個(gè)過程稱之為Animation(動畫)案淋。Animation作用于圖層距辆,圖層也提供了接口用于添加Animation。當(dāng)需要對圖層進(jìn)行Animation或者需要對Animation做出更多自定義行為的時(shí)候垮卓,就必須用到顯示動畫。顯示動畫基類CAAnimation师幕,能用的動畫類只有CABasicAnimation、CAKeyframeAnimation诬滩、CATransition霹粥、CAAnimationGroup。
UIView層動畫(+ (void)animateWithDuration:.....)
CALayer層動畫(CABasicAnimation,CAKeyframeAnimation)
接下來我會根據(jù)簡單到復(fù)雜的順序解釋如何使用這些動畫疼鸟,注意事項(xiàng)和分析什么時(shí)候使用他們后控。
1.先說簡單的UIView層動畫
簡單哪幾種就不說了,介紹下iOS7之后有的彈簧動畫.
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void(^)(void))animations completion:(void(^__nullable)(BOOLfinished))completionNS_AVAILABLE_IOS(7_0);
usingSpringWithDamping:的范圍為0.0f到1.0f空镜,數(shù)值越小「彈簧」的振動效果越明顯浩淘。
initialSpringVelocity:則表示初始的速度捌朴,數(shù)值越大一開始移動越快。
注意事項(xiàng)
1.animateWithDuration雖然是使用block张抄,但是這個(gè)block不需要我們對變量弱引用砂蔽,因?yàn)樗穷惙椒ā?br>
2.當(dāng)動畫結(jié)束的時(shí)候最好判斷下finishied的狀態(tài),因?yàn)樵诔绦蛑挟?dāng)多個(gè)View刷新的時(shí)候署惯,就可能出現(xiàn)動畫異常的現(xiàn)象左驾。
分析什么時(shí)候使用
1.動畫可能隨時(shí)被打斷的情況最好使用UIView層的動畫,因?yàn)檫@個(gè)動畫是直接更改的View的frame值极谊,我們可以隨時(shí)的記錄到準(zhǔn)確的frame值诡右。
2.只執(zhí)行一次(或者有限幾次)的情況下優(yōu)先使用,因?yàn)檫@個(gè)動畫每次執(zhí)行次數(shù)的參數(shù)轻猖。如果想反復(fù)執(zhí)行一種動畫帆吻,就要使用遞歸,但是遞歸在方法釋放時(shí)很容易出現(xiàn)問題咙边。
代碼:https://github.com/YBYHunter/JM_YUAnimation.git
2.CALayer層動畫
先上個(gè)繼承圖:
CAAnimation:動畫對象的基類
CAAnimationGroup:組合動畫
CATransition:轉(zhuǎn)場動畫
CAPropertyAnimation:屬性動畫
常用的動畫CABasicAnimation,CAKeyframeAnimation都是繼承CAPropertyAnimation.
CABasicAnimation(基礎(chǔ)動畫)的使用
參考這個(gè):http://www.reibang.com/p/02c341c748f9就可以了猜煮,里面已經(jīng)寫的很詳細(xì)了。
CAKeyframeAnimation(關(guān)鍵幀動畫)的使用
參考:http://www.reibang.com/p/b05986ded337
注意事項(xiàng)
1.因?yàn)樾薷牡氖莑ayer層參數(shù)样眠,而不是我們平常使用的UIView層數(shù)據(jù)友瘤。所以執(zhí)行完動畫后要注意你的layer坐標(biāo)是否回歸到正常。
2.動畫只想執(zhí)行一次檐束,需要配置removedOnCompletion辫秧、fillMode兩個(gè)屬性,要不然動畫會自動執(zhí)行逆動畫。
3.關(guān)于CABasicAnimation的delegate是strong屬性問題被丧。我個(gè)人猜測應(yīng)該是動畫過程怕對象銷毀了產(chǎn)生代理回調(diào)不準(zhǔn)確問題盟戏。出現(xiàn)的問題就是內(nèi)存會不斷的往上增加。然后解決方案就是聲明一個(gè)單獨(dú)的類實(shí)現(xiàn)delegate的回調(diào)甥桂。(詳細(xì)辦法http://www.reibang.com/p/02c341c748f9)柿究。
4.一個(gè) CABasicAniamtion 的實(shí)例對象只是一個(gè)數(shù)據(jù)模型,和他綁定到哪一個(gè)layer上是沒有關(guān)系的 黄选。方法addAnimation:forKey:是將 CABasicAniamtion 對象進(jìn)行了 copy 操作的蝇摸。所以在將其添加到一個(gè)layer上之后,我們還是將其再次添加到另一個(gè)layer上的办陷。
5.解決有時(shí)視圖會閃動一下的問題貌夕,我們可以將layer的屬性值設(shè)置為我們的動畫最后要達(dá)到的值,然后再給我們的視圖添加layer動畫民镜。
分析什么時(shí)候使用
1.CABasicAnimation一般反復(fù)循環(huán)的單一動畫使用啡专。
2.CAKeyframeAnimation一般是有多個(gè)幀動畫的時(shí)候使用, 但是每個(gè)幀之間是勻速的制圈,或者是一些其他規(guī)律變化的時(shí)候使用们童。
全部動畫的下載地址:https://github.com/YBYHunter/JM_YUAnimation.git
接下來說下使用貝塞爾曲線畫圖形和動畫畔况。
由于水平有限若發(fā)現(xiàn)有問題的地方請?jiān)u論。