Core Animation 文檔翻譯—附錄C(KVC擴展)

前言

 

關於CAAnimationCALayer類,核心動畫擴展了NSKeyValueCoding協議。這個擴展爲一些keys添加了默認值,擴大了封裝協議,添加了爲CGpoint、CGRect、CGSize和CATransform3D類型的支持。app

 

KVC支持的集成類

 

CAAnimationCALayer類是支持KVC的,這意味着咱們能夠爲任意的Keys賦值。即便是CALayer類沒有聲明的Key屬性,咱們仍舊能夠爲它賦值,以下:動畫

[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"someKey"];

咱們也可使用任意的Keys獲取對應的value,例如,獲取先前用someKey設置的value:3d

someKeyValue=[theLayer valueForKey:@"someKey"];

 

默認值的支持

 

核心動畫爲KVC添加了擴展,當沒有爲某個Key設置值的時候,將會提供一個默認值。CAAnimation和CALayer類支持這個擴招,經過使用defaultValueForKey:類方法。code

爲了爲Key提供默認值,建立要使用的類的子類,並重寫這個defaultValueForKey: 方法。咱們實現該方法時須要先檢查Key參數並返回合適的默認值。代碼C-1展現了defaultValueForKey: 的實現,此處爲masksToBounds屬性提供默認值。orm

 
代碼C-1 實現defaultValueForKey:的示例對象

+ (id)defaultValueForKey:(NSString *)key
{
    if ([key isEqualToString:@"masksToBounds"])
         return [NSNumber numberWithBool:YES];
 
    return [super defaultValueForKey:key];
}

 

封裝方式

 

當Key對應的value是有標量值或者C的結構體時,咱們必須在將value關聯到Layer以前,把value封裝爲對象類型。類似的,當獲取這些類型的vlaue時,咱們必須拆封相應的value使用相應的擴展類。表C-1列出了一般使用的C類型和經常使用的用於封裝的OC類。字符串

 Table C-1 用於C類型封裝的OC類get

C 類型 封裝類型
CGPoint NSValue
CGSize NSValue
CGRect NSValue
CATransform3D NSValue

 

Key Path支持結構體

 

經過使用Key paths,CAAnimationCALayer類讓咱們得到選中的數據類型的某個值。這種方式是很是便利的,對於指定某個咱們想要的作動畫的數據類型的某個值。咱們能夠利用這種便利方式經過使用setValue:forKeyPath:valueForKeyPath:方法設置和獲取這些值。animation


CATransform3D Key path


咱們可使用強大的key path(支持獲取某個數據類型爲CATransform3D的屬性的特定的transformation某個值) 。爲了爲Layer的transform指定完整的key path,咱們應該使用表C-2中transform或sublayerTransform的一個結構的字符值。例如爲了指定繞Layer的Z軸的旋轉因子,咱們應該使用key path爲transform.rotation.z。it

 Table C-2 Transform 分支的Key paths

Key path 分支 描述
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對象,x,y,z軸
translation.x 設置表明平移量的NSNumber對象,x軸
translation.y 設置表明平移量的NSNumber對象,y軸
translation.z 設置表明平移量的NSNumber對象,z軸
translation 設置包含一個NSSize或CGSize數據類型的NSValue對象。那個數據將會指定在x和y軸上平移的量

 

下面的例子展現了咱們如何使用setValue:forKeyPath:方法修改Layer。這個例子設置translation的X軸因子爲10點,引發layer移動相應的量在X軸。

[myLayer setValue:[NSNumber numberWithFloat:10.0] forKeyPath:@"transform.translation.x"];

 

注意:使用key paths設置values和經過OC屬性賦值是不同的。咱們不能直接使用屬性的符號來設置transform內的值,咱們必須使用setValue:forKeyPath:方法和上面指出的key path字符串。

 

CGPoint Key Paths

 

若是某個屬性的值是CGPoint類型,咱們爲路徑必須拼接表C-3中的一個份量,才能得到和設置相應的值。例如改變一個Layer的position屬性的x份量,咱們應該將key Path 寫成position.x。

 Table C-3 CGPoint數據類型的份量

結構體份量 描述
x 點的x份量
y 點的y份量

 

CGSize Key Paths

 

若是某個屬性的值是CGSize類型,咱們爲路徑必須拼接表C-4中的一個份量,才能得到和設置相應的值。
 Table C-3 CGPoint數據類型的份量

結構體份量 描述
width size的寬度份量
height size的高度份量


 

CGRect Key Paths

 

若是某個屬性的值是CGRect類型,咱們爲路徑必須拼接表C-5中的一個份量,才能得到和設置相應的值。例如,爲了改變Layer的bounds屬性的寬度份量,咱們應該寫成bounds.size.width。
 Table C-3 CGPoint數據類型的份量

結構體份量 描述
origin 矩形的原點,類型爲CGPoint
orgin.x 矩形原點的x份量
orgin.y 矩形原點的y份量
size 矩形的尺寸,類型爲CGSize
size.width 矩形尺寸的寬度份量
size.height 矩形的尺寸的高度份量
相關文章
相關標籤/搜索