CoreAnimation编程指南(十)KVC

来源:互联网 发布:edraw max mac破解方法 编辑:程序博客网 时间:2024/04/29 02:59
CAAnimation和CALayer类扩展了NSKeyValueCoding协议,给键添加默认值,扩展了封装协议,支持CGPoint、CGRect、CGSize和CATransform3D关键路径。

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

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

  你可以通过下面的代码检索“someKey”对应的值:
  someKeyValue=[theLayer valueForKey:@"someKey"];
    
  Mac OS X 注意:在Mac OS X上面,CALayer和CAAnimation类支持NSCoding协议,会自动归档这些你设置的额外键。

1.2 支持默认值

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

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

  Listing 1  Example implementation of defaultValueForKey:
  + (id)defaultValueForKey:(NSString *)key{
    if ([key isEqualToString:@"masksToBounds"])
         return [NSNumber numberWithBool:YES];
    return [super defaultValueForKey:key];
  }
 
1.3 封装约定

  当使用键值编码方法访问属性,而属性的值不支持标准键-值编码封装约定的对象(NSObject)时候,你可以使用如下的封装约定:
  CGPoint
    NSValue
  CGSize
    NSValue
  CGRect
    NSValue
  CGAffineTransform
    NSAffineTransform (Mac OS X only)
  CATransform3D
    NSValue

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

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

  CATransform3D公开如下的字段:
  rotation.x
    The rotation, in radians, in the x axis.
  rotation.y
    The rotation, in radians, in the y axis.
  rotation.z
    The rotation, in radians, in the z axis.
  rotation
    The rotation, in radians, in the z axis. This is identical to setting the rotation.z field.
  scale.x
    Scale factor for the x axis.
  scale.y
    Scale factor for the y axis.
  scale.z
    Scale factor for the z axis.
  scale
    Average of all three scale factors.
  translation.x
    Translate in the x axis.
  translation.y
    Translate in the y axis.
  translation.z
    Translate in the z axis.
  translation
    Translate in the x and y axis. Value is an NSSize or CGSize.
  
  CGPoint公开如下字段:
  x
    The x component of the point.
  y
    The y component of the point.

  CGSize公开如下字段:
  width
    The width component of the size.
  height
    The height component of the size.

  CGRect公开如下字段:
  origin
    The origin of the rectangle as a CGPoint.
  origin.x
    The x component of the rectangle origin.
  origin.y
    The y component of the rectangle origin.
  size
    The size of the rectangle as a CGSize.
  size.width
    The width component of the rectangle size.
  size.height
    The height component of the rectangle size.

  你不可以通过Objective-C 2.0的属性方法来指定一个结构字段的关键路径。如下的代码是无法正常执行的:
  myLayer.transform.rotation.x=0;

  相反你必须使用setValue:forKeyPath:或者valuForKeyPath:,如下:
  [myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"];

转自梦维:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-10-kvc.html
0 0
原创粉丝点击