# 使用圖層
????首先我們來創建一個簡單的項目,來操縱一些`layer`的屬性。打開Xcode,使用*Single View Application*模板創建一個工程。
????在屏幕中央創建一個小視圖(大約200 X 200的尺寸),當然你可以手工編碼,或者使用Interface Builder(隨你方便)。確保你的視圖控制器要添加一個視圖的屬性以便可以直接訪問它。我們把它稱作`layerView`。
????運行項目,應該能在淺灰色屏幕背景中看見一個白色方塊(圖1.3),如果沒看見,可能需要調整一下背景window或者view的顏色

圖1.3 灰色背景上的一個白色`UIView`
????這并沒有什么令人激動的地方,我們來添加一個色塊,在白色方塊中間添加一個小的藍色塊。
????我們當然可以簡單地在已經存在的`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 給視圖添加一個藍色子圖層
~~~
#import "ViewController.h"
#import
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *layerView;
?
@end
@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];
}
@end
~~~

圖1.5 白色`UIView`內部嵌套的藍色`CALayer`
????一個視圖只有一個相關聯的圖層(自動創建),同時它也可以支持添加無數多個子圖層,從清單1.1可以看出,你可以顯示創建一個單獨的圖層,并且把它直接添加到視圖關聯圖層的子圖層。盡管可以這樣添加圖層,但往往我們只是見簡單地處理視圖,他們關聯的圖層并不需要額外地手動添加子圖層。
????在Mac OS平臺,10.8版本之前,一個顯著的性能缺陷就是由于用了視圖層級而不是單獨在一個視圖內使用`CALayer`樹狀層級。但是在iOS平臺,使用輕量級的`UIView`類并沒有顯著的性能影響(當然在Mac OS 10.8之后,`NSView`的性能同樣也得到很大程度的提高)。
????使用圖層關聯的視圖而不是`CALayer`的好處在于,你能在使用所有`CALayer`底層特性的同時,也可以使用`UIView`的高級API(比如自動排版,布局和事件處理)。
????然而,當滿足以下條件的時候,你可能更需要使用`CALayer`而不是`UIView`:
* 開發同時可以在Mac OS上運行的跨平臺應用
* 使用多種`CALayer`的子類(見第六章,“特殊的圖層“),并且不想創建額外的`UIView`去包封裝它們所有
* 做一些對性能特別挑剔的工作,比如對`UIView`一些可忽略不計的操作都會引起顯著的不同(盡管如此,你可能會直接想使用OpenGL繪圖)
????但是這些例子都很少見,總的來說,處理視圖會比單獨處理圖層更加方便。
- Introduction
- 1. 圖層樹
- 1.1 圖層與視圖
- 1.2 圖層的能力
- 1.3 使用圖層
- 1.4 總結
- 2. 寄宿圖
- 2.1 contents屬性
- 2.2 Custom Drawing
- 2.3 總結
- 3. 圖層幾何學
- 3.1 布局
- 3.2 錨點
- 3.3 坐標系
- 3.4 Hit Testing
- 3.5 自動布局
- 3.6 總結
- 4. 視覺效果
- 4.1 圓角
- 4.2 圖層邊框
- 4.3 陰影
- 4.4 圖層蒙板
- 4.5 拉伸過濾
- 4.6 組透明
- 4.7 總結
- 5. 變換
- 5.1 仿射變換
- 5.2 3D變換
- 5.3 固體對象
- 5.4 總結
- 6. 專用圖層
- 6.1 CAShapeLayer
- 6.2 CATextLayer
- 6.3 CATransformLayer
- 6.4 CAGradientLayer
- 6.5 CAReplicatorLayer
- 6.6 CAScrollLayer
- 6.7 CATiledLayer
- 6.8 CAEmitterLayer
- 6.9 CAEAGLLayer
- 6.10 AVPlayerLayer
- 6.11 總結
- 7. 隱式動畫
- 7.1 事務
- 7.2 完成塊
- 7.3 圖層行為
- 7.4 呈現與模型
- 7.5 總結
- 8. 顯式動畫
- 8.1 屬性動畫
- 8.2 動畫組
- 8.3 過渡
- 8.4 在動畫過程中取消動畫
- 8.5 總結
- 9. 圖層時間
- 9.1 CAMediaTiming協議
- 9.2 層級關系時間
- 9.3 手動動畫
- 9.4 總結
- 10. 緩沖
- 10.1 動畫速度
- 10.2 自定義緩沖函數
- 10.3 總結
- 11. 基于定時器的動畫
- 11.1 定時幀
- 11.2 物理模擬
- 12. 性能調優
- 12.1. CPU VS GPU
- 12.2 測量,而不是猜測
- 12.3 Instruments
- 12.4 總結
- 13. 高效繪圖
- 13.1 軟件繪圖
- 13.2 矢量圖形
- 13.3 臟矩形
- 13.4 異步繪制
- 13.5 總結
- 14. 圖像IO
- 14.1 加載和潛伏
- 14.2 緩存
- 14.3 文件格式
- 14.4 總結
- 15. 圖層性能
- 15.1 隱式繪制
- 15.2 離屏渲染
- 15.3 混合和過度繪制
- 15.4 減少圖層數量
- 15.5 總結