文章分享至個人我的博客: https://cainluo.github.io/14770254062641.htmlhtml
最近做者一直有一些迷糊, 感受在研究上有了一些迷糊, 不知道怎麼往下研究了, 諮詢了一下朋友和一些前輩, 決定先玩一玩Core Animation, 畢竟是iOS的核心層之一, 也是最吸引人的地方之一, 今天就讓咱們先來了解一下Core Animation的一些概念知識. 最後: 若是你有更好的建議或者對這篇文章有不滿的地方, 請聯繫我, 我會參考大家的意見再進行修改, 聯繫我時, 請備註
Core Animation
若是以爲好的話, 但願你們也能夠打賞一下~嘻嘻~祝你們學習愉快~謝謝~git
- Core Animation是iOS與OS X平臺上負責圖形渲染與動畫的基礎設施。
- Core Animation能夠動畫視圖和其餘的可視元素。
- Core Animation爲你完成了實現動畫所需的大部分繪幀工做。
- 你只需在配置少許的動畫參數(如開始點位置和結束點位置)就可啓動Core Animation。
- Core Animation將大部分實際的繪圖任務交給了圖形硬件處理,圖形硬件會加速圖形渲染的速度。
- 這種自動化的圖形加速讓動畫具備更高的幀率且更加平滑,但這並不會增長CPU的負擔而致使影響你應用的運行速度。
在咱們平常開發iOS或者是Mac應用中, 咱們都避免不了對UI的佈局(否則要UI設計師幹嗎), 那咱們通常是怎麼去看應用中的圖層結構呢? 讓咱們直接來看一個Demo吧.微信
建立一個新的項目, 而後在項目當中隨意添加一個或者多個UI控件.app
運行了項目以後, 找到查看圖層的按鈕, 點擊以後就會跳轉到查看圖層的界面.ide
再換個角度看看~~模塊化
在iOS當中, 不管是神馬UIButton,UIScrollView, 仍是神馬UITableView, 都是基於UIView基類派生而來的, 而UIView是能夠處理Touch事件, 也支持Core Graphics的繪畫, 也能夠作仿射變換(也就是神馬旋轉, 縮放事件), 固然, 也能夠作相似於滑動, 漸變等UIView基礎動畫.佈局
CALayer實際上是和UIView的概念差很少, 也是一樣被層級關係樹所管理, 也同樣有神馬圖片, 文本, 背景色等內容, 或者是管理一些子圖層等等, 但CALayer和UIView最大的區別是在於,CALayer並不能處理用戶交互, 即便CALayer提供了一些方法來判斷觸點是否在圖層的範圍以內.性能
用過UIView的朋友們其實都知道, 每個UIView當中都有一個CALayer實例的圖層屬性, 也就是所謂backing layer.學習
UIView的職責是用來建立並管理這個圖層, 以確保層級關係中添加或者被移除的時候, 所關聯的Layer也會有一樣的操做.
雖然UIView是做爲一個管理者, 但實際上顯示在屏幕上以及作動畫效果的都是Layer,UIView僅僅只是對Layer的一個封裝, 提供了一些而外的方法, 好比Touch的功能,Core Animation底層方法的高級API, 因此UIView和CALayer是處於一個平級的關係.
說到這裏, 就會有一個疑惑, 爲何蘋果要把UIView和CALayer處於一個平級的關係呢?(或許有人會有這樣子的疑問)
其實緣由很簡單, 是爲了職責分離, 也算是模塊化劃分吧, 由於在Mac OS當中, 並無UIView這個類, 因此並不能處理Touch事件, 但卻有CALayer, 因此蘋果爲了可以讓Mac OS和iOS兩個系統相互共享代碼, 直接把CALayer給獨立出來了~~
其實在系統庫當中, 蘋果已經經過UIView提供了許多高級的API, 間接的使得動畫變得很簡單.
但這樣子就帶來另外的一個問題, 就是靈活性的缺失, 打個比方, 若是你想在底層作一些額外的操做, 經過系統提供的API是無法實現的, 這個時候, 咱們除了去學習和了解Core Animation以外, 再也沒有其餘途徑了.
那麼說到底,CALayer到底能用來作什麼呢? 有好幾個點, 好比:
- 陰影, 圓角, 邊框
- 3D變換(好比拉伸, 放大, 縮小等)
- 非矩形範圍
- 透明遮罩
- 多級非線性動畫
大體上就這一些, 後續咱們會經過學習Core Animation, 會了解更多的Layer, 以及怎麼利用Layer作出咱們想作的效果.
通常來說, 在咱們平常開發中, 都是面對視圖開發, 但若是某些特殊的場景, 咱們仍是須要面向CALayer來進行開發的, 好比
- 開發一個可同時在Mac OS和iOS兩個平臺上使用的應用
- 使用多種的CALayer子類, 而且不想建立一個UIView去封裝它們
- 作一些對性能特別挑剔的工做(暫時我也沒想到, 知道的朋友能夠和我說說)
但總的來講, 直接面向視圖開發, 要比面向CALayer開發的要簡單.
說了那麼多東西, 其實重點就那麼幾個:
- CALayer與UIView是平級關係
- CALayer與UIView的相同點與區別
- CALayer可跨平臺使用
- CALayer不可以響應事件
- UIView是基於CALayer封裝的一個類, 並提供Touch事件
項目地址: https://github.com/CainRun/CoreAnimation