[譯] Core Animation 編程指南 - 附錄C:鍵值編碼擴展

Core Animation 擴展了 NSKeyValueCoding 協議,由於它與 CAAnimationCALayer 類是關聯的。該擴展給一些鍵添加了默認值,擴展了包裝約定,給 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];
}
複製代碼

包裝約定 (Wrapping Conventions )

當鍵的數據由標量值或 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 鍵路徑

你可使用加強的鍵路徑支持來檢索包含 CATransform3D 數據類型的屬性的特定轉換值。要指定圖層形變的全鍵值路徑,你須要使用表 C-2 中字段鍵值的 transformsublayerTransform 的字符串值。例如,指定沿圖層 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 鍵路徑

若是給定屬性的值爲 CGPoint 數據類型,你能夠將表 C-3 中的一個字段名追加到屬性中,以獲取或設置該值。例如,你能夠操做 position.x,來修改圖層 position 屬性 x 元素的值。

表 C-3 CGPoint 數據結構字段

結構字段 描述
x x 元素的點。
y y 元素的點。

CGSize 鍵路徑

若是給定屬性的值爲 CGSize 數據類型,你能夠將表 C-4 中的一個字段名追加到屬性中,以獲取或設置該值。

表 C-4 CGSize 數據結構字段

結構字段 描述
width width 元素的大小。
height height 元素的大小。

CGRect 鍵路徑

若是給定屬性的值爲 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 元素的大小。
相關文章
相關標籤/搜索