Core Animation 文档翻译—附录C(KVC扩展)
前言
关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议。这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint、CGRect、CGSize和CATransform3D类型的支持。
KVC支持的集成类
CAAnimation和CALayer类是支持KVC的,这意味着我们可以为任意的Keys赋值。即使是CALayer类没有声明的Key属性,我们仍旧可以为它赋值,如下:
[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"someKey"];
我们也可以使用任意的Keys获取对应的value,例如,获取先前用someKey设置的value:
someKeyValue=[theLayer valueForKey:@"someKey"];
默认值的支持
核心动画为KVC添加了扩展,当没有为某个Key设置值的时候,将会提供一个默认值。CAAnimation和CALayer类支持这个扩招,通过使用defaultValueForKey:类方法。
为了为Key提供默认值,创建要使用的类的子类,并重写这个defaultValueForKey: 方法。我们实现该方法时需要先检查Key参数并返回合适的默认值。代码C-1展示了defaultValueForKey: 的实现,此处为masksToBounds属性提供默认值。
代码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类
table th:first-of-type {
width: 25%;
}
| C 类型 | 封装类型 |
|---|---|
| CGPoint | NSValue |
| CGSize | NSValue |
| CGRect | NSValue |
| CATransform3D | NSValue |
Key Path支持结构体
通过使用Key paths,CAAnimation和CALayer类让我们获得选中的数据类型的某个值。这种方式是非常便利的,对于指定某个我们想要的做动画的数据类型的某个值。我们可以利用这种便利方式通过使用setValue:forKeyPath:和valueForKeyPath:方法设置和获取这些值。
CATransform3D Key path
我们可以使用强大的key path(支持获取某个数据类型为CATransform3D的属性的特定的transformation某个值) 。为了为Layer的transform指定完整的key path,我们应该使用表C-2中transform或sublayerTransform的一个结构的字符值。例如为了指定绕Layer的Z轴的旋转因子,我们应该使用key path为transform.rotation.z。
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 | 矩形的尺寸的高度分量 |
Core Animation 文档翻译—附录C(KVC扩展)的更多相关文章
- Core Animation 文档翻译—附录B(可动画的属性)
前言 许多CALayer和CIFliter的属性都是可动画的.本节附录列出了这些属性默认使用的动画. CALayer可动画属性 表B-1展示了CALayer类的可动画属性.针对每个属性此表 ...
- Core Animation 文档翻译—附录A(Layer样貌相关属性动画)
前言 在渲染过程中,核心动画获取Layer的各种属性并以特定的顺序渲染他们.这个顺序决定了Layer的最终的样貌.本节将会阐述通过设置不同的Layer样貌相关属性对应产生的渲染结果. 注意:Mac ...
- Core Animation 文档翻译 (第二篇)
Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...
- Core Animation 文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 2018-01-13 星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用 ...
- Core Animation文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...
- Core Animation 文档翻译(第三篇)
Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...
- Core Animation 文档翻译 (第四篇)
Core Animation 文档翻译(第四篇) 让Layer的content动画起来 核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化.例如改 ...
- Core Animation 文档翻译 (第六篇)
高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其 ...
- Core Animation 文档翻译 (第八篇)—提高动画的性能
前言 核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证.尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评 ...
随机推荐
- SPRINGCLOUD 开发学习记录
一个简单的微服务系统:服务注册和发现,服务消费,负载均衡,断路器,智能路由,配置管理 服务注册中心: eureka是一个高可用组件,没有后端缓存,每一个实例注册后向注册中心发送心跳,默认情况下,eru ...
- [51nod1673]树有几多愁
lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出最大烦 ...
- hdu_2030
一个小小知识点,统计字符串中汉字出现的次数,直接给出代码 //ASCII码的范围是0-127所以,超出范围的都是汉字,因为一个汉字占两个字符位置,所以结果除以2就可以了 #include<cst ...
- [国嵌攻略][158][SPI裸机驱动设计]
SPI控制器工作流程 SPI控制器提供2个SPI接口.每个SPI接口有两个通道,分别为TX通道和RX通道.CPU要写数据到FIFO中,先写数据到SPI_TX_DATA寄存器中,这样此寄存器中的内容就会 ...
- sublimeserver启动本地服务器(sublime text)
今天又get到了一个新知识点,就是在sublime text上也可以模拟一个本地服务器的环境,前提是要先安装sublimeserver这个插件.这个插件的安装办法有两种. 1.我们可以直接在subli ...
- Sass嵌套
Sass 中还提供了选择器嵌套功能,但这也并不意味着你在 Sass 中的嵌套是无节制的,因为你嵌套的层级越深,编译出来的 CSS 代码的选择器层级将越深,这往往是大家不愿意看到的一点. 选择器嵌套为样 ...
- Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用
为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现.对于下面演示 ...
- Xmanager 远程到ubuntu失败
原因: 22端口没打开 SSH server服务没打开 解决办法: 打开22端口 如果没安装过防火墙:sudo apt-get install ufw ,sudo ufw enable 启动端口:su ...
- 解决方案 git@github.com出现Permission denied (publickey)
ubentu 13.10 git version 1.8.3.2 解决方案:ssh -T git@github.com出现Permission denied (publickey).的问题 今天的任 ...
- CSAPP 第二章随笔
类型转换问题 (1)int -> short 二进制位高位截断,低位保持不变 (2)同类型 unsign -> sign 记住二进制位是不变的 (3)P101页提到的编译器乘法优化问题,一 ...