參考文檔:
http://www.itdecent.cn/p/7018e61b6ee5
https://limboy.me/tech/2013/06/08/ios-graphic-animation.html
1、Core Animation
Core Animation 包含于 QuartzCore.framwork 中,是一組自由度更大的圖形繪制和動(dòng)畫(huà) API,但實(shí)現(xiàn)起來(lái)也會(huì)比 Core Graphics 麻煩一點(diǎn)。iOS 上的 UIKit 和動(dòng)畫(huà)效果大部分都是通過(guò) Core Animation 實(shí)現(xiàn)的。
Core Animation 是一個(gè)既支持iOS,也支持MAC OS 的動(dòng)畫(huà)框架,其執(zhí)行動(dòng)畫(huà)是在后臺(tái),不會(huì)阻塞主線程,同時(shí)其作用在CALayer,不是UIView。實(shí)際上它也干 Drawing 的活,這就需要CALayer 的幫助
CAAnimation 繼承結(jié)構(gòu)
|? -?CAAnimation
????|????-?CAPropertyAnimation
????????|????????-?CABasicAnimation
????????????|????????????-?CASpringAnimation
????????|????????-?CAKeyframeAnimation
????|????-?CATransition
? ? | -?CAAnimationGroup
CAAnimation: 核心動(dòng)畫(huà)的基礎(chǔ)類(lèi),不能直接使用,負(fù)責(zé)動(dòng)畫(huà)運(yùn)行時(shí)間、速度的控制,本身實(shí)現(xiàn)了CAMediaTiming協(xié)議。
CAPropertyAnimation: 屬性動(dòng)畫(huà)的基類(lèi)(通過(guò)屬性進(jìn)行動(dòng)畫(huà)設(shè)置,注意是可動(dòng)畫(huà)屬性),不能直接使用。
CABasicAnimation: 基礎(chǔ)動(dòng)畫(huà),通過(guò)屬性修改進(jìn)行動(dòng)畫(huà)參數(shù)控制,只有初始狀態(tài)和結(jié)束狀態(tài),可以看作是兩個(gè)關(guān)鍵幀的 CAKeyframeAnimation。
CASpringAnimation:阻尼動(dòng)畫(huà)
CAKeyframeAnimation: 關(guān)鍵幀動(dòng)畫(huà),同樣是通過(guò)屬性進(jìn)行動(dòng)畫(huà)參數(shù)控制,但是同基礎(chǔ)動(dòng)畫(huà)不同的是它可以有多個(gè)狀態(tài)控制。
CATransition: 轉(zhuǎn)場(chǎng)動(dòng)畫(huà),通過(guò)濾鏡進(jìn)行動(dòng)畫(huà)效果設(shè)置,能夠?yàn)閷犹峁┮瞥銎聊缓鸵迫肫聊坏膭?dòng)畫(huà)效果。iOS比Mac OS X的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)效果少一點(diǎn),UINavigationController 就是通過(guò)CATransition 實(shí)現(xiàn)了將控制器的視圖推入屏幕的動(dòng)畫(huà)效果。。
CAAnimationGroup:動(dòng)畫(huà)組,動(dòng)畫(huà)組是一種組合模式設(shè)計(jì),可以通過(guò)組合動(dòng)畫(huà)組來(lái)進(jìn)行所有動(dòng)畫(huà)行為的統(tǒng)一控制,組中的所有動(dòng)畫(huà)效果可以并發(fā)執(zhí)行。

1.1?隱式動(dòng)畫(huà)
介紹:
由于 CALayer 在設(shè)計(jì)之初就考慮它的動(dòng)畫(huà)操作功能,CALayer 很多屬性在修改時(shí)都能形成動(dòng)畫(huà)效果,這種屬性稱(chēng)為“隱式動(dòng)畫(huà)屬性”(隱式屬性動(dòng)畫(huà)的本質(zhì)是這些屬性的變動(dòng)默認(rèn)隱含了 CABasicAnimation 動(dòng)畫(huà)實(shí)現(xiàn))。
修改屬性產(chǎn)生隱式動(dòng)畫(huà):
?但是對(duì)于 UIView 的根圖層(Root CALayer)而言屬性的修改并不形成動(dòng)畫(huà)效果,因?yàn)楹芏嗲闆r下根圖層更多的充當(dāng)容器的做用,如果它的屬性變動(dòng)形成動(dòng)畫(huà)效果會(huì)直接影響子圖層。
對(duì)于非根圖層,設(shè)置圖層的可動(dòng)畫(huà)(Animatable)屬性(在動(dòng)畫(huà)結(jié)束后重新設(shè)置了 position,而 position 是可動(dòng)畫(huà)屬性)會(huì)產(chǎn)生默認(rèn)的隱式動(dòng)畫(huà)。解決這個(gè)問(wèn)題有兩種辦法:關(guān)閉圖層隱式動(dòng)畫(huà)、設(shè)置動(dòng)畫(huà)圖層為根圖層。
關(guān)閉隱式動(dòng)畫(huà):
要關(guān)閉隱式動(dòng)畫(huà)需要用到動(dòng)畫(huà)事務(wù) CATransaction:
CATransaction 是?Core Animation?里負(fù)責(zé)協(xié)調(diào)多個(gè)動(dòng)畫(huà)更新顯示操作,保證多個(gè)動(dòng)畫(huà)同時(shí)進(jìn)行,用于配置隱式動(dòng)畫(huà),即 CALayer 屬性修改依賴(lài) CATransaction.
和動(dòng)畫(huà)類(lèi)似 CATransaction 也分為隱式事務(wù)和顯式事務(wù)
隱式事務(wù):在某次 RunLoop 中設(shè)置了一個(gè)“Animatable”屬性,如果當(dāng)前沒(méi)有設(shè)置事務(wù),則會(huì)自動(dòng)創(chuàng)建一個(gè)CATransaction,并在當(dāng)前線程的下一個(gè) RunLoop 中 commit 這個(gè) CATransaction
顯式事務(wù):直接調(diào)用 CATransaction 的 [CATransaction begin],[CATransaction commit] 等相關(guān)方法。
另外事務(wù)可以嵌套,當(dāng)事務(wù)嵌套時(shí)候,只有最外層的事務(wù) commit 了之后,整個(gè)動(dòng)畫(huà)才會(huì)執(zhí)行。
在事務(wù)內(nèi)將隱式動(dòng)畫(huà)關(guān)閉:

1.2?顯式動(dòng)畫(huà)
顯式動(dòng)畫(huà)需要在代碼中使用 Core Animation 創(chuàng)建一個(gè)動(dòng)畫(huà)對(duì)象,并設(shè)置開(kāi)始和結(jié)束值,直到把動(dòng)畫(huà)應(yīng)用到某圖層上,進(jìn)而開(kāi)始執(zhí)行的動(dòng)畫(huà)。
幾種常用的 Layer:
CAEmitterLayer:是CoreAnimation框架中的粒子發(fā)射層,可以做出火焰等效果。
CAGradientLayer:是用于色彩梯度展示的layer圖層,通過(guò)CAGradientLayer,我們可以很輕松的創(chuàng)建出有過(guò)渡效果的色彩圖
CAReplocatorLayer:是拷貝視圖容器,我們可以通過(guò)它,將其中的子layer進(jìn)行拷貝,并進(jìn)行一些差異處理
CAShapeLayer:是圖形layer層,我們可以自定義這個(gè)層的形狀
CATextLayer:可以進(jìn)行文本的繪制
CALayer 層級(jí):

1、圖層樹(shù):包含每一層的對(duì)象模型值。他們就是你設(shè)定的圖層的屬性值
2、呈現(xiàn)樹(shù):包含了當(dāng)前動(dòng)畫(huà)發(fā)生時(shí)候?qū)⒁@示的值(例如你要給圖層背景顏色設(shè)置新的值的時(shí)候,它會(huì)立即修改圖層樹(shù)里面相應(yīng)的值。但是在呈現(xiàn)樹(shù)里面背景顏色值在將要顯示給用戶(hù)的時(shí)候才被更新為新值)
3、渲染樹(shù):在渲染圖層的時(shí)候使用呈現(xiàn)樹(shù)的值 (渲染樹(shù)負(fù)責(zé)執(zhí)行獨(dú)立于應(yīng)用活動(dòng)的復(fù)雜操作。渲染由一個(gè)單獨(dú)的進(jìn)程或線程來(lái)執(zhí)行,使其對(duì)應(yīng)用程序的運(yùn)行循環(huán)影響最?。?/p>
2、Core Graphics
Core Graphics 是一組用來(lái)繪制 2D 圖形的 API,使用 CPU 進(jìn)行計(jì)算。 新建一個(gè)項(xiàng)目時(shí),模板已經(jīng)自動(dòng)載入了 CoreGraphics.framwork 。
它是 iOS 的核心圖形庫(kù),包含 Quartz2D 繪圖 API 接口, 常用的是 point,size,rect 等這些圖形,都定義在這個(gè)框架中,類(lèi)名以 CG 開(kāi)頭的都屬于 CoreGraphics 框架,它提供的都是 C 語(yǔ)言函數(shù)接口,是可以在 iOS 和 mac OS 通用的。
并且 CoreAnimation 中大量使用到 CoreGraphics 中的類(lèi),因?yàn)閷?shí)現(xiàn)動(dòng)畫(huà)要用到圖形庫(kù)中的定義的屬性。
3、QuartzCore
QuartzCore 是位于 Mac OS X 的 Drawin 核心之上的繪圖層(包含CoreAnimation),是 iOS 系統(tǒng)的基本渲染框架,基于 CoreGraphics 的 OC 語(yǔ)言封裝,封裝出了基本渲染類(lèi) CALayer。
QuartzCore 在 iPhone OS 上的 framework為:

附:
iOS 與圖形圖像處理相關(guān)的框架
1)界面圖形框架-- UIKit
2)核心動(dòng)畫(huà)框架-- Core Animation
3)蘋(píng)果封裝的圖形框架-- Core Graphics & Quartz 2D
4)傳統(tǒng)跨平臺(tái)圖形框架-- OpenGL ES
5)蘋(píng)果最新力推的圖形框架 -- Metal
6)用于圖像、視頻處理的API,如添加濾鏡之類(lèi)的。-- Core Image?
7)適合視頻的第三方濾鏡方案-- GPUImage
8)游戲引擎-- Scene Kit(3D)和Sprite Kit(2D)
9)計(jì)算機(jī)視覺(jué)在iOS的應(yīng)用-- OpenCV for iOS
各個(gè)框架之間的關(guān)系:

圖像渲染流程:
