本文首发地址html
Core Animation 使用 action 对象实现图层的隐式动画行为。action 对象遵照 CAAction
协议,并定义一些在图层上执行的相关行为。全部的 CAAnimation 对象实现了该协议,而且这些对象一般被分配在图层属性改变时执行。git
动画属性是 action 的一种类型,你也能够定义任何包含你想要的行为的 action 。但为了实现该目的,你必须定义本身的 action 对象,并将它们与你 app 的图层对象关联。github
去建立你本身的 action 对象,使你的类遵照 CAAction 协议,并实现 runActionForKey:object:arguments:
方法。在该方法中,使用可用的信息去执行你想在图层上应用的 actions 。你可能使用该方法给图层添加一个动画对象,或执行其余的任务。bash
当你定义 action 对象时,你必须决定 action 怎样被触发。触发器为 action 定义键,后面你使用该键注册 action。Action 对象在下面的状况下会被触发:app
kCAOnOrderIn
。kCAOnOrderOut
。kCATransition
。在 action 可被执行以前,图层对象须要寻找响应的 action 对象去执行。图层相关的 actions 的键是被修改属性的名字,或可识别 action 的一个特别的字符串。当图层上发生合适的事件时,图层会调用 actionForKey:
方法去用于 action 对象关联的键去搜索 action 对象。在搜索过程当中,你的 app 能够在几个点插入本身,并为该键提供相关的 action 对象。ide
Core Animation 经过下面的顺序查找 action 对象:动画
若是图层有 delegate,而且 delegate 实现了 actionForLayer:forKey:
方法,图层调用该方法。delegate 必须作下面的其中一个:ui
图层在图层 actions 字典中查询给定的键。spa
图层在 style
字典中查询包含键的 actions 字典。(换言之,style
字典包含 actions
键,其值也是字典 。图层在第二个字典中,用给定的键去查询。)code
图层调用 defaultActionForKey:
类方法。
图层执行由 Core Animation 定义的隐式 action (若是有的话)。
若是你在任意合适的搜索点提供了一个 action 对象,图层会中止搜索,并执行返回的 action 对象。它发现一个 action 对象时,图层调用对象的 runActionForKey:object:arguments:
方法去执行该 action。若是你对于给定的键定义的 action 已是 CAAnimation
的实例,你可使用默认的实现去执行动画。若是你定义你本身的自定义对象遵照了 CAAction
协议,你必须使用该方法的对象实现来采起任何适当的操做。
你在哪安装 action 对象取决于你想如何修改图层。
actionForLayer:forKey:
方法。actions
字典中。style
字典中。defaultActionForKey:
方法。例 6-1 展现了使用提供的 action 对象的 delegate 方法的实现。在这种状况下,delegate 查找图层 contents
属性的改变,而且使用过渡动画将新内容交换到相应位置。
例 6-1 使用图层委托对象提供
- (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;
}
复制代码
你可使用 CATransaction 类暂时禁用图层的 actions 。你改变图层属性时, Core Animation 一般建立一个隐式事务对象去动画改变。若是你不想动画改变,你能够经过建立一个显式事务,而且将 kCATransactionDisableActions
属性设置为 true 来禁用隐式动画。例 6-2 展现了从图层树移除指定图层时,若是用代码禁用动画。
例 6-2 暂时禁用图层的 actions
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
复制代码
关于使用事务对象管理动画行为的更多信息,请参见显示事务容许你改变更画参数。