關於CAAnimation和CALayer類,核心動畫擴展了NSKeyValueCoding協議。這個擴展爲一些keys添加了默認值,擴大了封裝協議,添加了爲CGpoint、CGRect、CGSize和CATransform3D類型的支持。app
CAAnimation和CALayer類是支持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 paths,CAAnimation和CALayer類讓咱們得到選中的數據類型的某個值。這種方式是很是便利的,對於指定某個咱們想要的作動畫的數據類型的某個值。咱們能夠利用這種便利方式經過使用setValue:forKeyPath:和valueForKeyPath:方法設置和獲取這些值。animation
咱們可使用強大的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類型,咱們爲路徑必須拼接表C-3中的一個份量,才能得到和設置相應的值。例如改變一個Layer的position屬性的x份量,咱們應該將key Path 寫成position.x。
Table C-3 CGPoint數據類型的份量
結構體份量 | 描述 |
---|---|
x | 點的x份量 |
y | 點的y份量 |
若是某個屬性的值是CGSize類型,咱們爲路徑必須拼接表C-4中的一個份量,才能得到和設置相應的值。
Table C-3 CGPoint數據類型的份量
結構體份量 | 描述 |
---|---|
width | size的寬度份量 |
height | size的高度份量 |
若是某個屬性的值是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 | 矩形的尺寸的高度份量 |