coreanimation文档翻译—附录c(kvc扩展)

周小闲 周小闲     2022-10-14     428

关键词:

前言

?

关于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类

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

coreanimation文档翻译(第一篇)

CoreAnimation文档翻译(第一篇) 前言作为iOS开发,官方文档的阅读是很有必要的,值此周末便写下此文。作为iOS实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画高级技巧>,其gitbook地址,然总觉此书的翻译版,... 查看详情

coreanimation文档翻译(第一篇)

      CoreAnimation文档翻译(第一篇)    2018-01-13 星期6   前言:作为iOS开发,官方文档的阅读是很有必要的,值此周末便写下此文。作为iOS实际经验3年的开发,之前的应用之前有阅读并实践过经典的<i... 查看详情

coreanimation文档翻译(第四篇)

CoreAnimation文档翻译(第四篇)让Layer的content动画起来核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化。例如改变Layer的frame的size、改变Layer在屏幕上的position、应用旋转transform、或... 查看详情

coreanimation文档翻译(第二篇)

CoreAnimation文档翻译(第二篇)  核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系。核心动画不是我们APP内Views的替代品,相反,它是一种结合Views来提供更好性能和支持Co... 查看详情

coreanimation文档翻译(第五篇)

?构建Layer层次结构在APP中大多数情况下,将Layer和View对象结合使用是Layer最好的使用方式。然而,很多时候我们可能需要通过添加单独的Layer对象,以便增加视图继承层次;当为了提高性能,或为了实现View很难实现的特性,此时... 查看详情

coreanimation文档翻译(第六篇)

?高级动画技巧配置属性动画或者关键帧动画的方式是多种多样的。需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起。我们也可以使用其他类型的动画对象... 查看详情

coreanimation文档翻译(第七篇)—改变layer的默认动画

前言核心动画使用action对象实现它的可视化动画。一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象。所有的CAAnimation对象实现了这个协议,无论何时Layer的属性发生变化的时候就会执行对应的action对象(包含C... 查看详情

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

前言核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证。尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式。和所有的性能相关的问题一样,我们应该使用工具时时的评估和跟踪APP... 查看详情

第二十九篇coreanimation的使用

使用的的三个步骤1.初始化演员2.设置好剧情3.播放 附录:一个把商品添加到购物车的抛物线动画coreAnimation//1.初始化演员CALayer*layer=[[CALayeralloc]init];layer.bounds=CGRectMake(0,0,[UIScreenmainScreen].bounds.size.width,[UIScreenmainScreen].bou 查看详情

翻译连载|附录c:函数式编程函数库-《javascript轻量级函数式编程》|《你不知道的js》姊妹篇

原文地址:Functional-Light-JS原文作者:KyleSimpson-《You-Dont-Know-JS》作者关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是HTML最坚实的梁柱;分享,是CSS里最闪耀的一瞥;总结,是JavaScript中最严谨的逻辑。经过捶打磨练,... 查看详情

附录1:接口文档参考模板

https://www.w3cschool.cn/phalapi/5fhi1tth.html 附录1:接口文档参考模板由 chanzonghuang 创建,最后一次修改 2016-11-20虽然提供了在线接口参数的查看,但在和客户端对接过程中,我们作为后台开发,还是需要人工提供接口文... 查看详情

ios底层kvc原理(代码片段)

概念KVC的全称是Key-ValueCoding,翻译成中文是键值编码,键值编码是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议来间接访问其属性。既可以通过一个字符串key来访问某个属性。这种间接访问机制补充了... 查看详情

ios底层kvc原理(代码片段)

概念KVC的全称是Key-ValueCoding,翻译成中文是键值编码,键值编码是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议来间接访问其属性。既可以通过一个字符串key来访问某个属性。这种间接访问机制补充了... 查看详情

[hlsl]hlsl入门参考(dx11龙书附录b译文)(代码片段)

...B译文) HLSL高级着色语言参考文档龙书DirectX12现已推出中文版,其附录B的高级着色器语言参考的翻译质量比本文更高,有条件的读者可以去支持一下。目录文章目录目录变量类型标量类型矢量类型Swizzle... 查看详情

[oc学习笔记]kvc原理(代码片段)

KVC的全称是Key-ValueCoding,翻译成中文是键值编码,键值编码是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议来间接访问其属性。可以通过一个字符串key来访问某个属性。这种间接访问机制补充了实例变... 查看详情

unicodemath数学公式编码_翻译(unicodenearlyplain-textencodingofmathematicsversion3)

本文为UnicodeMath官方文档的翻译,原文看这。翻译如有不准还请谅解!由于我个人只想学习在word中使用UnicodeMath,故可能不会翻译整个文档。本文持续偶尔更新。目录简介编码简单的数学表达式.分数上标和下标空白(空格)字符的... 查看详情

unicodemath数学公式编码_翻译(unicodenearlyplain-textencodingofmathematicsversion3)

本文为UnicodeMath官方文档的翻译,原文看这。翻译如有不准还请谅解!由于我个人只想学习在word中使用UnicodeMath,故可能不会翻译整个文档。本文持续偶尔更新。目录简介编码简单的数学表达式.分数上标和下标空白(空格)字符的... 查看详情

附录c:standardparasiticextractionformat(spef)(代码片段)

文章目录C.1基础(Basics)C.2格式(Format)C.3完整语法知乎翻译圣经本附录将介绍标准寄生参数提取格式(SPEFSPEFSPEF),它是IEEE Std 1481IEEE\\Std\\1481IEEE Std 1481标准的一部分。C.1基础(Basics)SPEFSPEFSPEF允许以ASCIIASCIIASCII交换格式... 查看详情