关于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 | 矩形的尺寸的高度份量 |