图层的行为在以下情况发生的时候被触发:从图层树里面插入或者删除一个图层,图层的属性值被修改了,或者程序显式要求。通常情况下,行为触发器是动画显示的结果所在。
一个行为对象是一个通过CAAction协议响应行为标识符的对象。行为标识符使用标准圆点分隔的关键路径来命名。图层负责把行为标识符映射到特定的行为对象。当一个特定标识符的行为对象被确定的时候,它会发送一个CAAction协议定义的消息。
CALayer类提供了默认的CAAnimation的行为对象实例,一个兼容类所有动画层属性CAAction协议。表1中CALayer同样定义了以下没有直接对应到属性的行为触发器和他们的行为标识符。
表 1 Action 触发器和相应的标示符
Trigger | Action identifier |
一个layer被插入一个可见的layer树,或者layer的hidden属性被设为NO | kCAOnOrderIn |
一个layer被从一个可见的layer树中移除,或者layer的hidden属性被设为YES | kCAOnOrderOut |
使用replaceSublayer:with:方法将一个可见树中的layer替换 | kCATransition |
当一个行为触发器发生的时候,图层的actionForKey:方法被调用。此方法返回一个行为对象,对应的标识符作为参数,或如果行为对象不存在的话返回nil。
当CALayer为一个标识符实现的actionForKey:方法被调用的时候,以下的搜索模式将会被用到:
CAAction协议定义了行为对象如何被调用。实现CAAction协议的类包含一个方法runActionForKey:object:arguments:。
当行为对象收到一个runActionForKey:object:arguments:的消息时,行为标识符、行为发生所在的图层、额外的参数字典会被作为参数传递给方法。
通常行为对象是CAAnimation的子类实例,它实现了CAAction协议。然而你也可以返回任何实现了CAAction协议的类对象。当实例收到runActionForKey:object:arguments:的消息时,它需要执行相应的行为。
当CAAnimation实例受到消息runActionForKey:object:arguments:的时候,它把自己添加到图层的动力里面,触发动画的执行(查看代码1)。
代码 1 runActionForKey:object:arguments: 的实现:启动动画
1 2 3 4 5 6 | - ( void )runActionForKey:( NSString *)key object :( id )anObject arguments :( NSDictionary *)dict { [(CALayer *)anObject addAnimation : self forKey :key]; } |
你可以为行为标识符提供隐式的动画,通过插入一个CAAnimation的实例到style字典里面的actions的字典里面,通过实现委托方法actionForLayer:forKey:或者继承图层类并重载defaultActionForKey:方法返回一个相应的行为对象。
代码2的示例通过委托替换contents属性的隐式动画。
代码 2 contents 属性的隐式动画
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | - ( id <CAAction>)actionForLayer:(CALayer *)theLayer forKey :( NSString *)theKey { CATransition *theAnimation= nil ; if ([theKey isEqualToString : @ "contents" ]) { theAnimation = [[CATransition alloc ] init ]; theAnimation.duration = 1 .0 ; theAnimation.timingFunction = [CAMediaTimingFunction functionWithName :kCAMediaTimingFunctionEaseIn]; theAnimation.type = kCATransitionPush; theAnimation.subtype = kCATransitionFromRight; } return theAnimation; } |
代码3的示例使用actions字典模式禁用sublayers属性的默认动画。
代码 3 sublayers 属性的隐式动画
1 2 3 4 5 6 7 8 | // get a mutable version of the current actions dictionary NSMutableDictionary *customActions=[ NSMutableDictionary dictionaryWithDictionary :[theLayer actions ]]; // add the new action for sublayers [customActions setObject :[ NSNull null ] forKey : @ "sublayers" ]; // set theLayer actions to the updated dictionary theLayer.actions=customActions; |
默认情况下,你任何时候改变一个可动画显示的属性时,相应的动画将会伴随发生。
在修改图层属性的时候,你可以通过使用事务暂时禁用行为。查看“暂时禁用图层的行为”部分来获取更多信息。
联系客服