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,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评 ...
随机推荐
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ...
- HDU 1159 Common Subsequence【dp+最长公共子序列】
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu_1033(我怎么找到的这么水的题,只为保存代码。。。)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...
- 基于.netcore 开发的轻量Rpc框架
Rpc原理详解 博客上已经有人解释的很详细了,我就不在解释了.传送门 项目简介 项目是依赖于.net core2.0版本,内部都是依靠IOC来实现的,方便做自定义扩展.底层的通信是采用socket,s ...
- Angular 选项卡
<div ng-init="now=0;" class="nav"> <h4>选项卡</h4> <div > & ...
- [国嵌笔记][036][关闭MMU和CACHE]
关闭MMU和CACHE 1.Cache是一种容量小,但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝.按功能分为ICache(指令Cache)和DCache(数据Cache) 2.虚拟地址 ...
- phpstorm ctrl+shift+F键不管用,不弹出搜索弹框
般热键冲突搜狗默认简繁切换组合键位ctrl+shift+F故outlook2011按三建且失效应该能看搜狗输入状态简繁变搜狗设置按键-取消选简繁切换热键即在任务栏的语言地方点击一下再点击语言首选项.进 ...
- 邓_ phpcms_
{pc:content action="lists" catid="$catid" num="10" order="id DESC ...
- HTML面试
------------------------------------------------------- 行列 td tr ol -------------------------------- ...
- 单独编译IMX6Q的VPU示例程序:mxc_vpu_test.out
mxc_vpu_test.out是飞思卡尔为IMX6Q编写的VPU示例程序,有编解码和简单的网络传输功能. 首先从/opt/freescale/pkgs/中提取出imx-test-3.0.35-4.1 ...