動畫是iOS中非常有趣的部分,同時也是提升用戶交互體驗的有力工具,本文主要分為兩個部分,第一個部分講解基礎(chǔ)知識,第二個部分列舉基本使用
一、基礎(chǔ)知識
1.1、動畫相關(guān)框架
從上圖可以發(fā)現(xiàn)
- UIView在最上層
- 往下依次是CoreAnimation
- CoreGraphics、Hardware
1.2、iOS系統(tǒng)框架
上圖為iOS中的四層架構(gòu)
- UIView位于Cocoa Touch層
- CoreAnimation位于Media Layer中的QuartzCore框架中,查看QuartzCore的頭文件可以發(fā)現(xiàn),只引入了CoreAnimation。CALayer這個熟悉的對象是在CoreAnimation中,CoreAnimation往往作用于CALayer而不是UIView
- Core Graphics也是在Media Layer層中的框架
1.3、UIView、QuartzCore和CoreGraphics之間的關(guān)系
- UIView:主要負(fù)責(zé)事件響應(yīng)、頁面展示和與RunLoop相關(guān)操作
- QuartzCore:不單負(fù)責(zé)動畫的創(chuàng)建和執(zhí)行,還會將圖形圖像最終顯示到屏幕上(本質(zhì)上是CoreAnimation通過OpenGLES來做的)
- CoreGraphics:是一個基于C的庫函數(shù)的高級繪畫引擎,負(fù)責(zé)創(chuàng)建最終顯示到屏幕上的數(shù)據(jù)模型
1.4、UIView和CALayer的協(xié)同
- UIView都擁有一個CALayer,CALayer將UIView設(shè)置為了自己的代理對象
- 對于CALayer對象,改變其屬性,都會觸發(fā)一個簡單動畫
- UIView禁止在默認(rèn)情況下禁止了CALayer的動畫,所以我們在改變UIView的屬性的時候,不會觸發(fā)動畫,而在UIView的動畫block中,我們又能產(chǎn)生動畫,在原理上為:一個可動畫的CALayer屬性改變的時候,都會尋找并運行一個合適的改變,這個改變是CAAction對象,而UIView的CALayer對象會詢問他的delegate,即UIView,詢問提供一個CAAction對象,delegate可以通過下面三種方式之一進行響應(yīng)
1、它可以返回一個動作對象,這種情況下 layer 將使用這個動作。
2、它可以返回一個 nil, 這樣 layer 就會到其他地方繼續(xù)尋找。
3、它可以返回一個 NSNull 對象,告訴 layer 這里不需要執(zhí)行一個動作,搜索也會就此停止。
1.5、UIView和CALayer的關(guān)系
- UIView的屬性只是簡單地返回了CALayer對象的屬性
- UIView作為CALayer的代理,負(fù)責(zé)事件處理功能,CALayer負(fù)責(zé)頁面繪制(前面也提到了CoreAnimation的作用)
二、基本使用
2.1、Core Animation類圖
2.2、類別
我們常用到的為下面四種:
- CAAnimationGroup:動畫組,將不同類型的動畫同時進行或者連續(xù)進行
- CABasicAnimation:基本動畫,包括一些基本屬性的動畫,例如位移、縮放、漸變等
- CAKeyFrameAnimation:關(guān)鍵幀動畫,連續(xù)進行多個階段的動畫
- CATransition:過渡動畫
除了上面四種,還有一種是iOS9之后提供的彈簧動畫CASpringAnimation
另外,CoreGraphics中提供了仿射變化動畫,可以很方便地進行一些基本動畫操作