核心動畫(Core Animation Programming)

Content:

  • Layer Tree Structure
  • Core Animation's introduction
  • What's UIView?
  • What's CALayer?
  • UIView and CALayer relationship.
  • CALayer's function

Layer Tree Structure

Core Animation 這個框架實際上很是容易讓iOS開發者誤解僅僅是用來作動畫效果的框架.實際上動畫僅僅是是它功能的冰水一角. 它包括了圖形繪製,投影,動畫的Object-C 類集合.它經過咱們iOS開發熟悉的應用程序套件與CocoaTouch 視圖架構的抽象分層模式,提供了一套很是流暢的動畫的接口出來.編程

Core Animation 是一個複合引擎,它能快速的組合屏幕上不一樣顯示的內容. 並將其分解成獨立圖層,存儲到Layer Tree 的體系中.微信

Core Animation's Introduction

有了Core Animation 這個框架,開發者就能夠經過提供的接口,使得開發更加簡單,例如:數據結構

  • 簡單易用的高性能混合編程模型
  • 用相似於視圖同樣,使用圖層來建立複雜的編程接口
  • 輕量化的數據結構,它能夠同時顯示讓上百個圖層產生動畫效果
  • 一套很是較簡單的動畫接口,能讓動畫運行在獨立的線程中,並能夠獨立於主線程以外.
  • 一旦動畫配置完成並啓動,核心動畫就能獨立並徹底控制相應的動畫幀.
  • 提升應用性能.應用程序只有當發生改變的時候纔會重繪內容. 使用Core Animation 能夠不使用其餘圖形API,例如OpenGL 來獲取高效的動畫性能.
  • 靈活的佈局管理模型,容許圖層相對同級圖層的關係來設置屬性的位置和大小.

Core Animaiton 分類

  • 提供顯示內容的圖層類
  • 動畫和計時類
  • 佈局和約束類
  • 事務類,在原子更新的時候組合圖層類

核心動畫是包括了基礎類Quartz 核心框架(Quartz Core Framework)裏面.Core Animation Class hierarchy (核心動畫類層次結構圖以下).架構

image

What's UIView?

iOS開發中,這個使用頻率很是高的控件,同時在iOS 全部原生的視圖都是由UIView 派生而來. UIView 具有處理觸摸事件的能力,而且支持基於Core Graphics 繪圖.來實現仿射變換(好比旋轉縮放平移等).或者一些簡單的滑動/漸變的動畫.框架

視圖在屏幕上能夠是一個矩形塊,它可以攔截相似鼠標點擊或者觸摸手勢等用戶交互方式. 而且在層級關係上能夠互相嵌套,一個視圖能夠管理它全部的子視圖的位置等.在開發項目過程當中,這是很是常見的一個使用場景. 一個咱們最經常使用的控件,咱們是否真正瞭解它?佈局

What's CALayer

CALayer 類是一個與UIView 很是相似的類. 一樣也是被層級關係樹管理的矩形塊. 也能夠填充爲圖片,文本或者背景顏色等. 也能管理子視圖的位置.甚至CALayer 是有不少方法和屬性來作動畫處理和變換處理.性能

可是,CALayer與UIView在功能上的區別在哪兒? CALayer 不處理用戶交互. CALayer 不清楚具體的響應鏈(iOS經過視圖層級關係倆傳遞用戶觸摸事件的機制).它不能響應用戶事件,即便API提供了一些方法來判斷觸點是否在圖層的範圍以內.學習

Core Animation的類層次結構圖中,能夠發現圖層類(LayerClasses) 是Core Animation 的核心基礎. CALayer 是整個圖層類的基礎,它是全部核心動畫圖層類的父類. 和UIView 同樣,CALayer 也是有本身的父圖層類,以及一樣擁有子圖層類的集合. 它構成了一個圖層樹的層次結構. CAlayer 從Application KitCocoa Touch 的視圖類分離出來了.動畫

UIView and CALayer relationship.

UIView 與 CALayer 平行的層級關係

image

  • 每一個UIView 都會有一個CALayer 實例圖層屬性.也就是backing layer.UIView 的職責就是建立並管理這個圖層.用來確保當前子視圖在層級關係中添加或者移除的時候,他們的關聯圖層也一樣對應層級關係.
  • 實際上,這背後的關聯的圖層纔是真正用來在屏幕上顯示和作動畫的.UIView 就是對CALayer圖層的封裝,提供用戶交互接口.

圖層數結構

每一個可見的圖層樹,都由2個相應的樹組成.一個是呈現樹,一個是渲染樹.ui

image

  • 圖層樹: 包含每一層的對象模型值.其實就是開發者設置的圖層的屬性值
  • 呈現樹: 包括當前動畫發生時候將要顯示的相應的值,例如,你要給圖層背景顏色設置新的值的時候,它就會當即修改圖層樹裏對應的值.可是在呈現樹裏面的背景顏色值將要如今給用戶的時候纔會更新爲新值.
  • 渲染樹: 在渲染圖層的使用呈現樹的值,渲染樹負責執行獨立u應用活動的複雜操做.渲染由一個單獨的進程/線程來執行,使其對應用程序的運行循環影響降到最低.

爲何iOS要基於UIView 和 CALayer 提供兩個平行的層級關係.

蘋果爲什麼要如此設計?爲什麼不用一個簡單的層級來處理全部的事情. 其實緣由在於職責分離,這樣能夠避免不少重複代碼. 在iOSMac OS 兩個平臺下,事件和用戶交互存在比較大的差別,好比Mac OS的用戶交互能夠經過鼠標/鍵盤控制.而iOS則經過手勢觸摸. 這就是爲什麼iOS開發界面使用UIKitUIView ,而Mac OS 開發界面使用AppKitNSView. 由於他們之間的用戶交互手段不同.可是它們在功能上是很是相似的,因此都有CALayer ,而CALayer 只處理顯示上的需求,不作交互上的需求處理.這樣設計就能夠減小很是多沒必要要的代碼.

爲什麼開發者要使用CALayer ?

根據剛剛的描述,既然CALayer 只是UIView 的內部實現細節,那爲什麼在要來使用或者學習它? 並且蘋果也提供給咱們很是多優美簡潔且高效的接口,幾乎沒有必要去使用CALayer了.實際上接口的封裝帶來了方便卻喪失了靈活性.若是你略微想在底層上作一些改變或者使用一些蘋果沒有提供的接口功能,這是你就只能介入到Core Animation的底層以外,別無他選.

  • 圖層不能處理觸摸事件,一樣也要視圖不能作的事情:
    • 陰影,圓角,顏色邊框
    • 3D變換
    • 非矩形範圍
    • 透明遮罩
    • 多級非線性動畫

CALayer's function

除了CALayer 類,CoreAnimation 還提供了不少其餘內容的類.

  • MAC OSiOS 通用的類:

    • CAScrollLayer: CALayer 子類,簡化顯示圖層的一部份內容,CAScrollLayer 對象的滾動區域範圍在它的子圖層中定義.CAScorllLayer 不提供鍵盤/鼠標處理事件和不顯示滾動條.
    • CATextLayer : 爲了方便顯示字符串圖層
    • CATiledLayer: 容許遞增的顯示大而複雜的圖片
  • Mac OS 單獨提供的類

    • CAOpenGLLayer 提供一個OpenGL 渲染環境.你必須繼承這個類才能使用OpenGL 提供的內容. 內容能夠靜態也能夠及時更新

    • QCCompositionLayer(Quartz框架提供): 顯示Quartz合成動畫.

    • QTMovieLayer & QTCaptureLayer: (QTKit框架提供),播放QuickTime 視頻內容

  • iOS 新增的相關Layer

    • CAEAGLLayer : OpenGL ES 渲染環境

End

  • 參考 #核心動畫編程指南#
  • 參考 #iOS核心動畫高級技巧#

關注微信公衆號:iOSSir,每日更新蘋果資訊、技術乾貨!

image.png
相關文章
相關標籤/搜索