改变图层的默认行为
改变图层的默认行为
CoreAnimation
实现自己的隐式动画是通过图层使用操作对象,操作对象遵循CAAction
协议并且定义相关的行为在图层上执行。所有的CAAnimation
对象都实现了这个协议,当图层的属性发生改变,这些对象就会被分配执行。你可以定义几乎任意的动画行为,属性只是其中一种操作方式。因此你要定义动作,然后与你的图层对象关联起来。
采用 CAAction
协议自定义操作对象
自定义操作对象要自己的类遵循
CAAction
协议且实现runActionForKey:object:arguments:
方法。在这个方法中使用可利用的信息在图层上执行想要的操作,也可以在此方法中为图层添加动画对象或执行其它任务。
- 自定义一个操作对象,你必须确定如何触发操作。操作触发器定义稍后用于注册该操作的键。由以下任何一种情况触发操作对象
- 图层的一个属性值变化。这可以是图层的任一属性,不仅仅包括可动画的属性。为图层添加的自定义的属性也可关联操作。区分操作的
key
就是属性的名字 - 图层可见或被添加到图层的层级。区分此操作的
key
是kCAOnOrderIn
- 从图层层级中移除。区分此操作的
key
是kCAOnOrderOut
- 图层将涉及一个过渡动画。区分此操作的
key
是kCATransition
- 图层的一个属性值变化。这可以是图层的任一属性,不仅仅包括可动画的属性。为图层添加的自定义的属性也可关联操作。区分操作的
操作对象必须在图层上才有效果
动作执行前,图层需要找到相应的操作对象去执行。与图层相关的操作
key
是被修改的属性名称或标识操作符的特殊字符串。当某个事件在层上发生时,图层将会调用actionForKey
方法去搜索与这个key
关联的操作对象。CoreAnimation
查找操作对象顺序如下:
- 如果图层有代理且代理实现
actionForLayer:forKey
方法,图层调用此方法,代理必须实现以下一个- 返回操作对象给定的 key
- 如果没有处理此操作,返回
nil
,查找继续 - 返回 NSNull对象 ,搜索立即结束
- 图层在属性
actions
字典中查找给定的key - 图层在属性
style
字典中查找(换句话说:style
包含一个actions
的key,它的值仍然是字典。图层用给定的key在第二个字典中查找) - 图层调用
defaultActionForKey:
的类方法 - 图层执行
CoreAnimation
定义的隐式操作(如果有)
建立自己的操作对象将依据你怎样修改图层
// 示例:实现操作对象代理方法,改变图层的 contents 属性,使用过渡动画交换成新的内容
- (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 类暂时禁用操作
当改变图层属性时,CoreAniamtion 通常会创建一个隐式的事务对变更进行动画。如果不想对改变进行动画,可以通过创建隐匿事务设置属性
kCATransactionDisableActions = true
禁用隐式动画。
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];