Core Animation 擴展了 NSKeyValueCoding
協議,由於它與 CAAnimation
和 CALayer
類是關聯的。該擴展給一些鍵添加了默認值,擴展了包裝約定,給 CGPoint, CGRect, CGSize, 和 CATransform3D 類型添加了鍵路徑支持。bash
CAAnimation 和 CALayer 類是符合鍵值編碼的容器類,這意味着你能夠給任意鍵賦值。即便 someKey 是 CALayer 類爲聲明的屬性,你也能夠向下面這樣給它賦值:數據結構
[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"someKey"];
複製代碼
你也能夠獲取任意鍵的值就像檢索其餘鍵的值同樣。例如,你可使用下面的代碼,去獲取以前給 someKey 路徑賦的值:app
someKeyValue = [theLayer valueForKey:@"someKey"];
複製代碼
OS X 說明:CAAnimation 和 CALayer 類會自動歸檔你給類實例的鍵設置的值,它支持 NSCoding 協議。
動畫
Core Animation 爲鍵值編碼添加了一個約定,經過該約定,類能夠爲沒有賦值的鍵提供默認值。CAAnimation 和 CALayer 類經過使用 defaultValueForKey: 類方法來支持此約定。ui
若要爲鍵提供默認值,請建立所需類的子類,並重寫其 defaultValueForKey: 方法。你的該方法的實現,應該檢查鍵參數,並返回一個合適的默認值。例 C-1 展現了一個圖層對象經過實現 defaultValueForKey: 方法,來給 masksToBounds 屬性提供默認值的示例。編碼
例 C-1 實現 defaultValueForKey:
方法的示例:spa
+ (id)defaultValueForKey:(NSString *)key {
if ([key isEqualToString:@"masksToBounds"])
return [NSNumber numberWithBool:YES];
return [super defaultValueForKey:key];
}
複製代碼
當鍵的數據由標量值或 C 數據結構組成時,必須先將該類型包裝在對象中,而後再將其分配給圖層。一樣,當訪問該類型時,你必須檢索一個對象,而後使用適當類的擴展打開適當的值。表 C-1 列出了經常使用的 C 類型和用來包裝它們 Objective-C 類。code
表 C-1 C 類型數據的包裝類orm
C 類型 | 包裝類 |
---|---|
CGPoint | NSValue |
CGSize | NSValue |
CGRect | NSValue |
CATransform3D | NSValue |
CGAffineTransform | NSAffineTransform (僅限 OS X) |
CAAnimation 和 CALayer 類容許你使用鍵路徑來訪問選中數據結構的字段值。該特性是一種便捷的方式,用來指定你想動畫的數據結構的字段。你也能夠將該約定和 setValue:forKeyPath:
和 valueForKeyPath:
方法結合使用去設置和獲取字段的值。對象
你可使用加強的鍵路徑支持來檢索包含 CATransform3D
數據類型的屬性的特定轉換值。要指定圖層形變的全鍵值路徑,你須要使用表 C-2 中字段鍵值的 transform
或 sublayerTransform
的字符串值。例如,指定沿圖層 z 軸 的旋轉因子,你應該指定 transform.rotation.z 的值。
表 C-2 形變字段鍵值路徑
字段鍵值 | 描述 |
---|---|
rotation.x | 設置爲 NSNumber 對象,該對象的值是 x 軸上以弧度爲單位的旋轉。 |
rotation.y | 設置爲 NSNumber 對象,該對象的值是 y 軸上以弧度爲單位的旋轉。 |
rotation.z | 設置爲 NSNumber 對象,該對象的值是 z 軸上以弧度爲單位的旋轉。 |
rotation | 設置爲 NSNumber 對象,該對象的值是 z 軸上以弧度爲單位的旋轉。該字段與 rotation.z 等效。 |
scale.x | 設置爲 NSNumber 對象,其值是 x 軸的比例因子。 |
scale.y | 設置爲 NSNumber 對象,其值是 y 軸的比例因子。 |
scale.z | 設置爲 NSNumber 對象,其值是 z 軸的比例因子。 |
scale | 設置爲 NSNumber 對象,其值是全部三個比例因子的平均值。 |
translation.x | 設置爲 NSNumber 對象,其值是沿 x 軸的平移因子。 |
translation.y | 設置爲 NSNumber 對象,其值是沿 y 軸的平移因子。 |
translation.z | 設置爲 NSNumber 對象,其值是沿 z 軸的平移因子。 |
translation | 設置爲包 含NSSize 或 CGSize 數據類型的 NSValue 對象。該數據類型表示要在 x 軸和 y 軸上平移的量。 |
下面的例子,展現了你如何使用 setValue:forKeyPath:
方法修改圖層。該例中將 x 軸的平移因子設置爲 10 個點,會形成圖層想指示的軸線偏移。
[myLayer setValue:[NSNumber numberWithFloat:10.0] forKeyPath:@"transform.translation.x"];
複製代碼
注意:使用鍵路徑賦值與使用 Objective-C 的屬性賦值並不相同。你不能使用屬性符號來設置形變值。你必須在前面的鍵路徑字符串中使用的 setValue:forKeyPath:
方法。
若是給定屬性的值爲 CGPoint 數據類型,你能夠將表 C-3 中的一個字段名追加到屬性中,以獲取或設置該值。例如,你能夠操做 position.x
,來修改圖層 position
屬性 x
元素的值。
表 C-3 CGPoint 數據結構字段
結構字段 | 描述 |
---|---|
x | x 元素的點。 |
y | y 元素的點。 |
若是給定屬性的值爲 CGSize 數據類型,你能夠將表 C-4 中的一個字段名追加到屬性中,以獲取或設置該值。
表 C-4 CGSize 數據結構字段
結構字段 | 描述 |
---|---|
width | width 元素的大小。 |
height | height 元素的大小。 |
若是給定屬性的值爲 CGRect 數據類型,你能夠將表 C-5 (此處原文爲 C-3,但我以爲應該是寫錯了,因此這裏改爲 C-5。) 中的一個字段名追加到屬性中,以獲取或設置該值。例如,你能夠操做 bounds.size.width
,來修改圖層 bounds
屬性 width
元素的值。
表 C-5 CGRect 數據結構字段
結構字段 | 描述 |
---|---|
origin | CGPoint 矩形的原點。 |
origin.x | 矩形原點 x 元素的值。 |
origin.y | 矩形原點 y 元素的值。 |
size | CGSize 矩形的大小。 |
size.width | CGSize 矩形的 width 元素的大小。 |
size.height | CGSize 矩形的 height 元素的大小。 |