zoukankan      html  css  js  c++  java
  • Core Animation Programming Guide

    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 type Wrapping class
    CGPoint NSValue
    CGSize NSValue
    CGRect NSValue
    CATransform3D NSValue
    CGAffineTransform NSAffineTransform(仅为 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 Path Description
    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 Field Description
    x The x component of the point
    y The y component of the point

    CGSize Key Paths

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

    表 C-4 CGSize data structure fields

    Structure Field Description
    width The width component of the size
    height The height component of the size

    CGRect Key Paths

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

    表 C-5 CGRect data structure fields

    Structure Field Description
    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.
  • 相关阅读:
    无线电,电磁波
    ThinkPHP实现支付宝接口功能
    php中发送email
    编程基本功训练:流程图画法及练习
    PHP中的特殊类,接口类和抽象类(都不能直接实例化)
    PHP中面相对象对象的知识点整理
    memcache 与 mencached扩展的区别
    MVC框架 与Smarty
    浏览器缓存机制
    PHP中九大缓存技术总结
  • 原文地址:https://www.cnblogs.com/1oo1/p/4278862.html
Copyright © 2011-2022 走看看