CoreAnimation 使用action object去实现layer的隐式的动画的。action object实现了CAAction协议,并定义了相关的行为在layer上进行。所有的CAAnimation对象都实现了此协议,当layer的可动画的属性的值改变的时候,这些对象通常会赋值并执行。
可动画的属性就是一种action。
自定义Action Object
为了定义一个action object,需要实现CAAction协议的方法runActionForKey:object:arguments:.
当定义了一个action object,我们必须决定什么时间去触发此action。action object可以在下面几种情况下触发:
1.当layer的属性发生改变的时候,可以是任何属性,不仅仅是可动画的属性,也可以使自定义的属性。这时action的key为属性的名字。
2.layer变为可见的,或者添加到另一个layer上时,此时action的key为kCAOnOrderIn.
2.layer从superlayer上移除时,此时action的key为kCAOnOrderOut.
3.当layer进行一个transition animation时,此时action的key为kCATransition.
Core Animation寻找action object的顺序
在一个action执行之前,layer需要找到对应的action object去执行。当layer上一些事件(上面的三种)发生时,layer会调用自己的 actionForKey: 方法去寻找对应的action object,
Core Animation提供的查找顺序如下:
1.如果layer有一个delegate ,此delegate实现了actionForLayer:forKey方法,layer会调用此方法,此方法可以根据对应的key返回相应的action object,如果返回的是nil,则继续步骤2,如果返回的为NSNull对象,则立即停止搜索。
2.layer在actions字典中去寻找。
3.layer在style字典中去寻找(style字典中有一个actions的key,其value为一个字典,layer就是在这个字典中去寻找key对应的action object)
4.layer调用类方法defaultActionForKey:
5.layer进行Core Animation定义的implicit action。
上面5步需要解释的是style字典,一般自定义的属性的action存到这个里面。