您的位置:首页 > 编程语言

CoreAnimation编程指南(十)KVC

2013-09-27 21:49 218 查看
CAAnimation和CALayer类扩展了NSKeyValueCoding协议,给键添加默认值,扩展了封装协议,支持CGPoint、CGRect、CGSize和CATransform3D关键路径。


1.1键-值编码兼容的容器类

CALayer和CAAnimation都是键-值编码兼容的容器类,允许你修改属性键对应的值。即使键为“someKey”对应的属性没有被定义,你也可以给“someKey”的键设置一个值,如下:
[theLayersetValue:[NSNumbernumberWithInteger:50]forKey:@"someKey"];

你可以通过下面的代码检索“someKey”对应的值:

someKeyValue=[theLayervalueForKey:@"someKey"];


MacOSX注意:在MacOSX上面,CALayer和CAAnimation类支持NSCoding协议,会自动归档这些你设置的额外键。


1.2支持默认值

核心动画添加的键值编码约定,允许一个类在被使用时键没有被设置相应值的时候提供默认值。CALayer或CAAnimation支持该约定,通过使用方法defaultValueForKey:。

为了给键提供默认值,你创建相应的子类,并重载defaultValueForKey:。子类实现相应的键参数检查并返回适当的默认值。清单1描述了一个实现defaultValueForKey:的例子,它给masksToBounds提供新的默认值。

Listing1ExampleimplementationofdefaultValueForKey:
+(id)defaultValueForKey:(NSString*)key
{
if([keyisEqualToString:@"masksToBounds"])
return[NSNumbernumberWithBool:YES];

return[superdefaultValueForKey:key];
}



1.3封装约定

当使用键值编码方法访问属性,而属性的值不支持标准键-值编码封装约定的对象(NSObject)时候,你可以使用如下的封装约定:

CType
Class
CGPoint

NSValue

CGSize

NSValue

CGRect

NSValue

CGAffineTransform

NSAffineTransform
(MacOSXonly)
CATransform3D
NSValue


1.4支持结构字段的关键路径

CAAnimation提供支持使用关键路径访问选择的结构字段。这在为动画关键路径指定结构字段的时候非常有帮助,同时你可以使用setValue:forKeyPath:和valueForKeyPath来设置和读取相应的值。

CATransform3D公开如下的字段:

StructureField
Description
rotation.x
Therotation,inradians,inthexaxis.
rotation.y
Therotation,inradians,intheyaxis.
rotation.z
Therotation,inradians,inthezaxis.
rotation
Therotation,inradians,inthezaxis.Thisisidenticaltosettingtherotation.zfield.
scale.x
Scalefactorforthexaxis.
scale.y
Scalefactorfortheyaxis.
scale.z
Scalefactorforthezaxis.
scale
Averageofallthreescalefactors.
translation.x
Translateinthexaxis.
translation.y
Translateintheyaxis.
translation.z
Translateinthezaxis.
translation
Translateinthexandyaxis.ValueisanNSSizeorCGSize.
CGPoint公开如下字段:

StructureField
Description
x
Thexcomponentofthepoint.
y
Theycomponentofthepoint.
CGSize公开如下字段:

StructureField
Description
width
Thewidthcomponentofthesize.
height
Theheightcomponentofthesize.
CGRect公开如下字段:

StructureField
Description
origin
TheoriginoftherectangleasaCGPoint.
origin.x
Thexcomponentoftherectangleorigin.
origin.y
Theycomponentoftherectangleorigin.
size
ThesizeoftherectangleasaCGSize.
size.width
Thewidthcomponentoftherectanglesize.
size.height
Theheightcomponentoftherectanglesize.
你不可以通过Objective-C2.0的属性方法来指定一个结构字段的关键路径。如下的代码是无法正常执行的:
myLayer.transform.rotation.x=0;

相反你必须使用setValue:forKeyPath:或者valuForKeyPath:,如下:

[myLayersetValue:[NSNumbernumberWithInt:0]forKeyPath:@"transform.rotation.x"];


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: