若是說CALayer是UIView內部實現細節,那咱們爲何要全面地瞭解它呢?蘋果固然爲咱們提供了優美簡潔的UIView接口,那麼咱們是否就不必直接去處理Core Animation的細節了呢? git
某種意義上說的確是這樣,對一些簡單的需求來講,咱們確實不必處理CALayer,由於蘋果已經經過UIView的高級API間接地使得動畫變得很簡單。 github
可是這種簡單會不可避免地帶來一些靈活上的缺陷。若是你略微想在底層作一些改變,或者使用一些蘋果沒有在UIView上實現的接口功能,這時除了介入Core Animation底層以外別無選擇。 框架
咱們已經證明了圖層不能像視圖那樣處理觸摸事件,那麼他能作哪些視圖不能作的呢?這裏有一些UIView沒有暴露出來的CALayer的功能: 佈局
咱們將會在後續章節中探索這些功能,首先咱們要關注一下在應用程序當中CALayer是怎樣被利用起來的。 性能
首先咱們來建立一個簡單的項目,來操縱一些layer的屬性。打開Xcode,使用Single View Application模板建立一個工程。 動畫
在屏幕中央建立一個小視圖(大約200 X 200的尺寸),固然你能夠手工編碼,或者使用Interface Builder(隨你方便)。確保你的視圖控制器要添加一個視圖的屬性以即可以直接訪問它。咱們把它稱做layerView。 ui
運行項目,應該能在淺灰色屏幕背景中看見一個白色方塊(圖1.3),若是沒看見,可能須要調整一下背景window或者view的顏色 編碼
圖1.3 灰色背景上的一個白色UIView atom
這並無什麼使人激動的地方,咱們來添加一個色塊,在白色方塊中間添加一個小的藍色塊。 spa
咱們固然能夠簡單地在已經存在的UIView上添加一個子視圖(隨意用代碼或者IB),但這不能真正學到任何關於圖層的東西。
因而咱們來建立一個CALayer,而且把它做爲咱們視圖相關圖層的子圖層。儘管UIView類的接口中暴露了圖層屬性,可是標準的Xcode項目模板並無包含Core Animation相關頭文件。因此若是咱們不給項目添加合適的庫,是不可以使用任何圖層相關的方法或者訪問它的屬性。因此首先須要添加QuartzCore框架到Build Phases標籤(圖1.4),而後在vc的.m文件中引入庫。
圖1.4 把QuartzCore庫添加到項目
以後就能夠在代碼中直接引用CALayer的屬性和方法。在清單1.1中,咱們用建立了一個CALayer,設置了它的backgroundColor屬性,而後添加到layerView背後相關圖層的子圖層(這段代碼的前提是經過IB建立了layerView並作好了鏈接),圖1.5顯示告終果。
清單1.1 給視圖添加一個藍色子圖層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *layerView;

@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//create sublayer
CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
blueLayer.backgroundColor = [UIColor blueColor].CGColor;
//add it to our view
[self.layerView.layer addSublayer:blueLayer];
}
|
圖1.5 白色UIView內部嵌套的藍色CALayer
一個視圖只有一個相關聯的圖層(自動建立),同時它也能夠支持添加無數多個子圖層,從清單1.1能夠看出,你能夠顯示建立一個單獨的圖層,而且把它直接添加到視圖關聯圖層的子圖層。儘管能夠這樣添加圖層,但每每咱們只是見簡單地處理視圖,他們關聯的圖層並不須要額外地手動添加子圖層。
在Mac OS平臺,10.8版本以前,一個顯著的性能缺陷就是因爲用了視圖層級而不是單獨在一個視圖內使用CALayer樹狀層級。可是在iOS平臺,使用輕量級的UIView類並無顯著的性能影響(固然在Mac OS 10.8以後,NSView的性能一樣也獲得很大程度的提升)。
使用圖層關聯的視圖而不是CALayer的好處在於,你能在使用全部CALayer底層特性的同時,也可使用UIView的高級API(好比自動排版,佈局和事件處理)。
然而,當知足如下條件的時候,你可能更須要使用CALayer而不是UIView
可是這些例子都不多見,總的來講,處理視圖會比單獨處理圖層更加方便。
這一章闡述了圖層的樹狀結構,說明了如何在iOS中由UIView的層級關係造成的一種平行的CALayer層級關係,在後面的實驗中,咱們建立了本身的CALayer,並把它添加到圖層樹中。