玩轉iOS開發:1.《Core Animation》基礎概念

CainLuo發表於2016-10-21

文章分享至我的個人部落格: https://cainluo.github.io/14770254062641.html


作者感言

最近作者一直有一些迷糊, 感覺在研究上有了一些迷糊, 不知道怎麼往下研究了, 諮詢了一下朋友和一些前輩, 決定先玩一玩Core Animation, 畢竟是iOS的核心層之一, 也是最吸引人的地方之一, 今天就讓我們先來了解一下Core Animation的一些概念知識. 最後: 如果你有更好的建議或者對這篇文章有不滿的地方, 請聯絡我, 我會參考你們的意見再進行修改, 聯絡我時, 請備註Core Animation如果覺得好的話, 希望大家也可以打賞一下~嘻嘻~祝大家學習愉快~謝謝~


簡介

  • Core AnimationiOSOS X平臺上負責圖形渲染與動畫的基礎設施。
  • Core Animation可以動畫檢視和其他的可視元素。
  • Core Animation為你完成了實現動畫所需的大部分繪幀工作。
  • 你只需在配置少量的動畫引數(如開始點位置和結束點位置)就可啟動Core Animation
  • Core Animation將大部分實際的繪圖任務交給了圖形硬體處理,圖形硬體會加速圖形渲染的速度。
  • 這種自動化的圖形加速讓動畫具有更高的幀率且更加平滑,但這並不會增加CPU的負擔而導致影響你應用的執行速度。

以上的文字都是從官方文件裡直接拷貝的, 如果有啥問題, 直接去PK通用官方文件iOS官方文件~~


圖層與檢視結構

在我們日常開發iOS或者是Mac應用中, 我們都避免不了對UI的佈局(不然要UI設計師幹嘛), 那我們一般是怎麼去看應用中的圖層結構呢? 讓我們直接來看一個Demo吧.

建立一個新的專案, 然後在專案當中隨意新增一個或者多個UI控制元件.

1

執行了專案之後, 找到檢視圖層的按鈕, 點選之後就會跳轉到檢視圖層的介面.

2

3

再換個角度看看~~

4

iOS當中, 無論是神馬UIButton,UIScrollView, 還是神馬UITableView, 都是基於UIView基類派生而來的, 而UIView是可以處理Touch事件, 也支援Core Graphics的繪畫, 也可以做仿射變換(也就是神馬旋轉, 縮放事件), 當然, 也可以做類似於滑動, 漸變等UIView基礎動畫.


CALayer

CALayer其實是和UIView的概念差不多, 也是同樣被層級關係樹所管理, 也一樣有神馬圖片, 文字, 背景色等內容, 或者是管理一些子圖層等等, 但CALayerUIView最大的區別是在於,CALayer並不能處理使用者互動, 即使CALayer提供了一些方法來判斷觸點是否在圖層的範圍之內.


UIView和CALayer層級關係

用過UIView的朋友們其實都知道, 每一個UIView當中都有一個CALayer例項的圖層屬性, 也就是所謂backing layer.

UIView的職責是用來建立並管理這個圖層, 以確保層級關係中新增或者被移除的時候, 所關聯的Layer也會有同樣的操作.

雖然UIView是作為一個管理者, 但實際上顯示在螢幕上以及做動畫效果的都是Layer,UIView僅僅只是對Layer的一個封裝, 提供了一些而外的方法, 比如Touch的功能,Core Animation底層方法的高階API, 所以UIViewCALayer是處於一個平級的關係.


疑惑

說到這裡, 就會有一個疑惑, 為什麼蘋果要把UIViewCALayer處於一個平級的關係呢?(或許有人會有這樣子的疑問)

其實原因很簡單, 是為了職責分離, 也算是模組化劃分吧, 因為在Mac OS當中, 並沒有UIView這個類, 所以並不能處理Touch事件, 但卻有CALayer, 所以蘋果為了能夠讓Mac OSiOS兩個系統相互共享程式碼, 直接把CALayer給獨立出來了~~


CALayer的能力

其實在系統庫當中, 蘋果已經通過UIView提供了許多高階的API, 間接的使得動畫變得很簡單.

但這樣子就帶來另外的一個問題, 就是靈活性的缺失, 打個比方, 如果你想在底層做一些額外的操作, 通過系統提供的API是沒法實現的, 這個時候, 我們除了去學習和了解Core Animation之外, 再也沒有其他途徑了.

那麼說到底,CALayer到底能用來做什麼呢? 有好幾個點, 比如:

  • 陰影, 圓角, 邊框
  • 3D變換(比如拉伸, 放大, 縮小等)
  • 非矩形範圍
  • 透明遮罩
  • 多級非線性動畫

大致上就這一些, 後續我們會通過學習Core Animation, 會了解更多的Layer, 以及怎麼利用Layer做出我們想做的效果.


使用CALayer

一般來講, 在我們日常開發中, 都是面對檢視開發, 但如果某些特殊的場景, 我們還是需要面向CALayer來進行開發的, 比如

  • 開發一個可同時在Mac OS和iOS兩個平臺上使用的應用
  • 使用多種的CALayer子類, 並且不想建立一個UIView去封裝它們
  • 做一些對效能特別挑剔的工作(暫時我也沒想到, 知道的朋友可以和我說說)

但總的來說, 直接面向檢視開發, 要比面向CALayer開發的要簡單.


總結一下

說了那麼多東西, 其實重點就那麼幾個:

  • CALayer與UIView是平級關係
  • CALayer與UIView的相同點與區別
  • CALayer可跨平臺使用
  • CALayer不能夠響應事件
  • UIView是基於CALayer封裝的一個類, 並提供Touch事件

工程地址

專案地址: https://github.com/CainRun/CoreAnimation


最後

碼字很費腦, 看官賞點飯錢可好

微信

支付寶

相關文章