Core Animation 文档翻译—附录C(KVC扩展)

前言

?

关于CAAnimationCALayer类,核心动画扩展了NSKeyValueCoding协议。这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint、CGRect、CGSize和CATransform3D类型的支持。

?

KVC支持的集成类

?

CAAnimationCALayer类是支持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,CAAnimationCALayer类让我们获得选中的数据类型的某个值。这种方式是非常便利的,对于指定某个我们想要的做动画的数据类型的某个值。我们可以利用这种便利方式通过使用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轴上平移的量

&nsbp;

下面的例子展示了我们如何使用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分量

?

CGPoint 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 矩形的尺寸的高度分量

原文地址:https://www.cnblogs.com/zhouyubo/p/8432387.html

时间: 2024-10-15 01:05:09

Core Animation 文档翻译—附录C(KVC扩展)的相关文章

Core Animation 文档翻译—附录B(可动画的属性)

前言 ? 许多CALayer和CIFliter的属性都是可动画的.本节附录列出了这些属性默认使用的动画. ? CALayer可动画属性 ? 表B-1展示了CALayer类的可动画属性.针对每个属性此表也列出了对应的默认动画对象的类型,这些动画以隐式的方式执行. ? Table B-1 Layer的属性和他们默认的动画 table th:first-of-type { width: 25%;} 属性 默认动画 anchorPoint 使用默认的隐式CABasicAnimation对象,在表Tabl

Core Animation 文档翻译 (第一篇)

Core Animation 文档翻译(第一篇)   2018-01-13  星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用之前有阅读并实践过经典的<iOS核心动画高级技巧>,[其gitbook地址](https://zsisme.gitbooks.io/ios-/content/chapter10/custom-easing-functions.html),然总觉此书的翻译版,对于目前的CoreAnimation 官

Core Animation 文档翻译 (第六篇)

? 高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其他类型的动画对象来创建可视化的transitions和别的有趣的动画效果. ? 过渡动画支持Layer可见性的变化 就像本级标题名字所说一样,一个transition动画对象为Layer创建一个动画性的过渡效果.transistion对象最常用的方法就是以协调的方式让一个Layer动画形式的出现,并

Core Animation 文档翻译 (第八篇)—提高动画的性能

前言 核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证.尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评估和跟踪APP的性能,以至于我们能够确保性能是提升而不是退化的. ? 综合的建议和技巧 有以下几种方式能让我们的Layers更有效的实现效果.对于任何优化来说,我们应该在尝试优化前先测量当前代码的性能:根据未优化之前的性能检测结果,能够让我们知道所做的优化是否提升了性能. ? 尽可能的使用不透明的L

Core Animation 文档翻译 (第七篇)—改变Layer的默认动画

前言 核心动画使用action对象实现它的可视化动画.一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象.所有的CAAnimation对象实现了这个协议,无论何时Layer的属性发生变化的时候就会执行对应的action对象(包含CAAnimation对象). 可动画的属性是action的一种类型,我们可以定义几乎所有我们想要的actions,为了达成这个目的,我们就需要定义自己的action并把它们关联到Layer对象 ? 自定义遵守CAAction协议的Ac

iOS Core Animation Advanced Techniques(四):隐式动画和显式动画

隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第一部分讨论了Core Animation除了动画之外可以做到的任何事情.但是动画师Core Animation库一个非常显著的特性.这一章我们来看看它是怎么做到的.具体来说,我们先来讨论框架自动完成的隐式动画(除非你明确禁用了这个功能). 事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.动画并不需要你在Core Animation中手动打开,相反需要明确地关闭,否则他会一直存在.

Core Animation编程指南

本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原文的类型属于编程指南,所以示例代码并不多,更多的是理论层面的探讨.所以译文中加入了大量的示例代码,以提高本文的可操作性.希望本文能够对你有所帮助. 本文由海水的味道翻译,转载请注明译者和出处,请勿用于商业用途! 关于Core Animation Core Animation是iOS与OS X平台上负责图形渲染

iOS Core Animation Advanced Techniques(七):高效绘图、图像IO以及图层性能

高效绘图不必要的效率考虑往往是性能问题的万恶之源. ——William Allan Wulf 在第12章『速度的曲率』我们学习如何用Instruments来诊断Core Animation性能问题.在构建一个iOS app的时候会遇到很多潜在的性能陷阱,但是在本章我们将着眼于有关绘制的性能问题. 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必要的情况下,

iOS Core Animation Advanced Techniques-显式动画

上七章节: 图层树 图层的寄宿图 图层几何学 图层视觉效果 图层变换 专用图层 隐式动画 这篇随笔主要介绍有关图层显式动画. 显示动画: 能对一些属性做指定的自定义动画,或者创建非线性动画 属性动画: 属性动画作用于图层的某个单一属性,并指定了它的一个目标值,或一连串将要做动画的值 属性动画分两种: 1.基础 2.关键帧 基础动画:(通过CALayer的实例方法addAnimation: forKey:给图层添加显示动画) CABasicAnimation-->CAPropertyAnimati