Core Animation
這個框架實際上很是容易讓iOS開發者誤解僅僅是用來作動畫效果的框架.實際上動畫僅僅是是它功能的冰水一角. 它包括了圖形繪製,投影,動畫的Object-C 類集合.它經過咱們iOS開發熟悉的應用程序套件與CocoaTouch 視圖架構的抽象分層模式,提供了一套很是流暢的動畫的接口出來.編程
Core Animation
是一個複合引擎,它能快速的組合屏幕上不一樣顯示的內容. 並將其分解成獨立圖層,存儲到Layer Tree 的體系中.微信
有了Core Animation 這個框架,開發者就能夠經過提供的接口,使得開發更加簡單,例如:數據結構
核心動畫是包括了基礎類Quartz 核心框架(Quartz Core Framework)裏面.Core Animation Class hierarchy (核心動畫類層次結構圖以下).架構
在iOS
開發中,這個使用頻率很是高的控件,同時在iOS
全部原生的視圖都是由UIView
派生而來. UIView
具有處理觸摸事件的能力,而且支持基於Core Graphics
繪圖.來實現仿射變換(好比旋轉縮放平移等).或者一些簡單的滑動/漸變的動畫.框架
視圖在屏幕上能夠是一個矩形塊,它可以攔截相似鼠標點擊或者觸摸手勢等用戶交互方式. 而且在層級關係上能夠互相嵌套,一個視圖能夠管理它全部的子視圖的位置等.在開發項目過程當中,這是很是常見的一個使用場景. 一個咱們最經常使用的控件,咱們是否真正瞭解它?佈局
CALayer
類是一個與UIView
很是相似的類. 一樣也是被層級關係樹管理的矩形塊. 也能夠填充爲圖片,文本或者背景顏色等. 也能管理子視圖的位置.甚至CALayer
是有不少方法和屬性來作動畫處理和變換處理.性能
可是,CALayer與UIView在功能上的區別在哪兒? CALayer
不處理用戶交互. CALayer
不清楚具體的響應鏈(iOS
經過視圖層級關係倆傳遞用戶觸摸事件的機制).它不能響應用戶事件,即便API提供了一些方法來判斷觸點是否在圖層的範圍以內.學習
在Core Animation
的類層次結構圖中,能夠發現圖層類(LayerClasses
) 是Core Animation
的核心基礎. CALayer
是整個圖層類的基礎,它是全部核心動畫圖層類的父類. 和UIView
同樣,CALayer
也是有本身的父圖層類,以及一樣擁有子圖層類的集合. 它構成了一個圖層樹的層次結構. CAlayer 從Application Kit
與 Cocoa Touch
的視圖類分離出來了.動畫
UIView
都會有一個CALayer
實例圖層屬性.也就是backing layer
.UIView
的職責就是建立並管理這個圖層.用來確保當前子視圖在層級關係中添加或者移除的時候,他們的關聯圖層也一樣對應層級關係.UIView
就是對CALayer
圖層的封裝,提供用戶交互接口.每一個可見的圖層樹,都由2個相應的樹組成.一個是呈現樹,一個是渲染樹.ui
蘋果爲什麼要如此設計?爲什麼不用一個簡單的層級來處理全部的事情. 其實緣由在於職責分離,這樣能夠避免不少重複代碼. 在iOS
和 Mac OS
兩個平臺下,事件和用戶交互存在比較大的差別,好比Mac OS
的用戶交互能夠經過鼠標/鍵盤控制.而iOS
則經過手勢觸摸. 這就是爲什麼iOS
開發界面使用UIKit
和UIView
,而Mac OS
開發界面使用AppKit
和 NSView
. 由於他們之間的用戶交互手段不同.可是它們在功能上是很是相似的,因此都有CALayer
,而CALayer
只處理顯示上的需求,不作交互上的需求處理.這樣設計就能夠減小很是多沒必要要的代碼.
根據剛剛的描述,既然CALayer
只是UIView
的內部實現細節,那爲什麼在要來使用或者學習它? 並且蘋果也提供給咱們很是多優美簡潔且高效的接口,幾乎沒有必要去使用CALayer
了.實際上接口的封裝帶來了方便卻喪失了靈活性.若是你略微想在底層上作一些改變或者使用一些蘋果沒有提供的接口功能,這是你就只能介入到Core Animation
的底層以外,別無他選.
除了CALayer
類,CoreAnimation
還提供了不少其餘內容的類.
MAC OS
與 iOS
通用的類:
CAScrollLayer
: CALayer
子類,簡化顯示圖層的一部份內容,CAScrollLayer
對象的滾動區域範圍在它的子圖層中定義.CAScorllLayer
不提供鍵盤/鼠標處理事件和不顯示滾動條.CATextLayer
: 爲了方便顯示字符串圖層CATiledLayer
: 容許遞增的顯示大而複雜的圖片Mac OS
單獨提供的類
CAOpenGLLayer
提供一個OpenGL
渲染環境.你必須繼承這個類才能使用OpenGL 提供的內容. 內容能夠靜態也能夠及時更新
QCCompositionLayer
(Quartz
框架提供): 顯示Quartz
合成動畫.
QTMovieLayer
& QTCaptureLayer
: (QTKit框架提供),播放QuickTime 視頻內容
iOS 新增的相關Layer
CAEAGLLayer
: OpenGL ES
渲染環境關注微信公衆號:iOSSir,每日更新蘋果資訊、技術乾貨!