核心动画使用动作对象为图层实现其隐式动画行为。动作对象是符合CAAction协议并定义要在层上执行的某些相关行为的对象。所有CAAnimation对象都实现该协议,并且通常将这些对象分配给每当图层属性更改时执行的对象。
动画属性是动作的一种,但是您可以定义具有几乎任何所需行为的动作。但是,为此,您必须定义动作对象并将它们与应用程序的图层对象相关联
自定义操作对象采用CAAction协议
要创建自己的动作对象,请CAAction从您的一个类中采用协议并实现该runActionForKey:object:arguments:方法。在该方法中,使用可用信息来执行要在图层上执行的任何操作。您可以使用该方法将动画对象添加到图层,也可以使用它执行其他任务。
定义动作对象时,必须决定如何触发该动作。动作的触发器定义了您以后用来注册该动作的键。可以通过以下任意一种情况触发操作对象:
图层属性之一的值已更改。这可以是图层的任何属性,而不仅仅是可设置动画的属性。(您还可以将动作与添加到图层中的自定义属性相关联。)标识此动作的关键是属性的名称。
图层变为可见或已添加到图层层次结构中。标识此操作的密钥是kCAOnOrderIn。
该图层已从图层层次结构中删除。标识此操作的密钥是kCAOnOrderOut。
该层将要包含在过渡动画中。标识此操作的密钥是kCATransition。
操作对象必须安装在层上才能生效
在可以执行动作之前,该层需要找到要执行的相应动作对象。与图层相关的动作的关键字是要修改的属性的名称或标识动作的特殊字符串。当图层上发生适当的事件时,图层将调用其actionForKey:方法以搜索与键关联的操作对象。在此搜索过程中,您的应用可以将自己插入多个位置,并为该键提供相关的操作对象。
核心动画按以下顺序查找动作对象:
如果该层具有委托,并且该委托实现该actionForLayer:forKey:方法,则该层将调用该方法。委托必须执行以下操作之一:
返回给定键的操作对象。
nil如果它不处理该操作,则返回,在这种情况下,搜索继续。
返回NSNull对象,在这种情况下,搜索立即结束。
层在层的actions字典中查找给定的键。
该层在style字典中查找包含键的动作字典。(换句话说,style字典包含一个actions键,其值也是一个字典。该层在第二个字典中查找给定的键。)
该层调用其defaultActionForKey:类方法。
图层执行由Core Animation定义的隐式动作(如果有)。
如果在任何适当的搜索点提供动作对象,则图层将停止其搜索并执行返回的动作对象。当找到动作对象时,图层将调用该对象的runActionForKey:object:arguments:方法来执行该动作。如果您为给定键定义的动作已经是CAAnimation该类的实例,则可以使用该方法的默认实现来执行动画。如果要定义自己的符合CAAction协议的自定义对象,则必须使用该方法的对象实现来执行适当的操作。
操作对象的安装位置取决于您打算如何修改图层。
对于仅在特定情况下可能要应用的操作,或者对于已经使用委托对象的图层,请提供委托并实现其actionForLayer:forKey:方法。
对于通常不使用委托的图层对象,请将操作添加到图层的actions字典中。
对于与您在图层对象上定义的自定义属性相关的操作,请将该操作包括在图层的style字典中。
对于图层行为至关重要的动作,请对该图层进行子类化并覆盖该defaultActionForKey:方法。
清单6-1显示了用于提供操作对象的委托方法的实现。在这种情况下,委托将查找对图层contents属性的更改,并使用过渡动画将新内容交换到位。
- (id)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类暂时禁用操作
您可以使用CATransaction该类暂时禁用图层操作。更改图层的属性时,Core Animation通常会创建一个隐式事务对象以使更改动起来。如果您不想为更改设置动画,则可以通过创建显式事务并将其kCATransactionDisableActions属性设置为来禁用隐式动画true。清单6-2显示了一段代码片段,当从图层树中删除指定的图层时,该片段将禁用动画。
清单6-2 临时禁用层的操作
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
网友评论