Core Animation Programming Guide - Key-Value Coding Extensions

Key-Value Coding Extensions

Core Animation 在 CAAnimation 和 CALayer 两个相关类上扩展了 NSKeyValueCoding 协议。这个扩展为一些键添加了默认值,扩展封装的约定,而且添加键路径支持 CGPoint,CGRect,CGSize 和 CATransform3D 类型。

Key-Value Coding Compliant Container Classes

CAAnimation 和 CALayer 类是键值对容器类,意味着你可以为特有的键赋值。即使 someKey 不是 CALayer 类声明的属性,你也可以像下面一样为它设置值。

[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"someKey"];

你也可以像检索其他键值对一样检索这个特有键对应的值。例如,检索先前设置的 someKey,你可以用下面的代码:

someKeyValue = [theLayer valueForKey:@"someKey"];

注:CAAnimation 和 CALayer 类自动地归档你设置任意额外的键对应的这些类的实例。


Default Value Support

Core Animation 添加了一个约定的键值编码,凭此约定一个类可以为一个没有设置值的键提供默认的值。 CAAnimation 和 CALayer 类用 defaultValueForKey: 方法支持这个约定。

为了为一个键提供默认值,创建一个设计类的子类然后重写它的 defaultValueForKey: 方法。在实现这个方法时应该检查键的参数且返回合适的默认值。代码 C-1 展示了一个 layer 对象为 masksToBounds 属性提供默认参数的重写 defaultValueForKey: 方法的示例。

代码 C-1 Example implementation of defaultVlueForKey

+(id)defaultValueForKey:(NSString*)key
{
    if([key isEqualToString:@"masksToBounds"])
        return [NSNumber numberWithBool:YES];
        
    return [super defaultValueForKey:key];
}

Wrapping Conventions

当一个键的数据包含向量值或 C 数据结构时,你需要在把它赋值给 layer 前封装为对象类型。相同地,当访问那个类型时,你需要先检索一个对象然后把对象转换为合适的值。表 C-1 列出了需要封装的一般使用的 C 类型和 OBjective-C 类。

表 C-1 Wrapper classes for C types

C typeWrapping class
CGPointNSValue
CGSizeNSValue
CGRectNSValue
CATransform3DNSValue
CGAffineTransformNSAffineTransform(仅为 OS X 时)

Key Path Support for Structures

CAAnimation 和 CALayer 类使你可以用键的路径访问选定的数据结构的字段。这个特性用来确定你想动画的数据结构的字段很方便。你也可以把这些和 setValue:forKeyPath: 和 valueForKeyPath: 方法连起来一起方便的使用然后获得这些字段。

CATransform3D Key Paths

你可以使用提升后的键的路径支持为一个包含 CATransform3D 数据类型的属性检索形态值。为了为一个 layer 的形态指定全键的路径,你将使用字符串值 transformsublayerTransform 后跟一个表 C-2 中的字段键的路径。例如,为了指定一个围绕 layer 的 Z 轴旋转的向量,你将指定键的路径为 transform.rotation.z

表 C-2 Transform field value key paths

Field Key PathDescription
rotation.x设置一个 x 轴的旋转弧度 NSNumber 对象
rotation.y设置一个 y 轴的旋转弧度 NSNumber 对象
rotation.z设置一个 z 轴的旋转弧度 NSNumber 对象
rotation设置一个 z 轴的旋转弧度 NSNumber 对象。这个字段会同样地设置给 rotation.z 字段。
scale.x设置一个 x 轴上的 NSNumber 对象的缩放向量
scale.y设置一个 y 轴上的 NSNumber 对象的缩放向量
scale.z设置一个 z 轴上的 NSNumber 对象的缩放向量
scale设置一个平均的 NSNumber 向量值
translation.x设置一个 x 轴上的 NSNumber 对象的转换向量
translation.y设置一个 y 轴上的 NSNumber 对象的转换向量
translation.z设置一个 z 轴上的 NSNumber 对象的转换向量
translation设置一个包含 NSSize 和 CGSize数据类型的 NSValue 对象。这个数据类型指定了在 x、y 轴的转换量。

下面的例子展示了怎么通过 setValue:forKeyPath: 方法修改一个 layer。例子设置了 x 轴转换 10 points 的向量,会使 layer 沿着指定的轴的转换量改变。

[myLayer setValue:[NSNumber numberWithFloat:10.0] forKeyPath:@"transform.translation.x"];

注:使用键的路径设置值不同于使用 Objective-C 属性。你不能使用属性标记设置形态值,需要使用上面提到的 setValue:forKeyPath: 方法设置。


CGPoint Key Paths

如果给定属性的值是 CGPoint 数据类型,你可以追加表 C-3 中的一个字段来设置或者得到值。例如,要改变 layer 的 position 属性的 x 组件值,你可以写成 position.x 这样的键的路径。

表 C-3 CGPoint data structure fields

Structure FieldDescription
xThe x component of the point
yThe y component of the point
CGSize Key Paths

如果给定的属性是 CGSized 数据类型,你可以追加表 C-4 中的一个字段名称来设置或者得到属性值。

表 C-4 CGSize data structure fields

Structure FieldDescription
widthThe width component of the size
heightThe height component of the size
CGRect Key Paths

如果给定的属性是 CGRect 数据类型,你可以追加表 C-4 中的一个字段名称来设置或者得到属性值。例如,要改变一个 layer 的 bounds 属性的宽,你可以把键的路径写成 bounds.size.width

表 C-5 CGRect data structure fields

Structure FieldDescription
originThe origin of the rectangle as a CGPoint
origin.xThe x component of the rectangle origin
origin.yThe y component of the rectangle origin
sizeThe size of the rectangle as a CGSize
size.widthThe width component of the rectangle size
size.heightThe height component of the rectangle size.

转载于:https://www.cnblogs.com/1oo1/p/4278862.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值