核心动画使用action对象实现它的可视化动画。一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象。全部的CAAnimation对象实现了这个协议,不管什么时候Layer的属性发生变化的时候就会执行对应的action对象(包含CAAnimation对象)。
可动画的属性是action的一种类型,咱们能够定义几乎全部咱们想要的actions,为了达成这个目的,咱们就须要定义本身的action并把它们关联到Layer对象html
为了建立咱们本身的action对象,须要让咱们的类遵照CAAction协议并实现runActionForKey:object:arguments: 方法。在这个方法中使用可用的信息执行任何咱们想要在相应的Layer上执行的action。咱们可能使用这个方法将动画对象添加到相应的Layer上,或者使用它去执行其余的任务。
当咱们定义一个action对象的时候,咱们必须设定这个action将如何被触发的方式。Action的触发方式是须要定义一个Key,咱们而后使用这个Key注册该action。Action对象可以经过下面任何一种情景触发:app
在action可以被执行前,Layer须要先找到对应的要执行的action。(和Layer相关的action)Key是正在被改变的属性名或者定义该action的特殊字符串。当某个事件发生在Layer上的时候,Layer会调用actionForKey:方法经过相应的Key搜索action对象;在搜索期间,咱们APP中能够在如下几个地方插入代码,并为那个Key提供相关的action对象。
核心动画按照下面的顺序查找action对象:动画
若是咱们在上述搜索的地方提供action对象,Layer将会中止搜索并执行所返回的action对象。当他找到action对象,Layer会调用那个对象的runActionForKey:object:arguments: 方法执行动画。若是咱们定义的action对象是某个CAAnimation类的实例,咱们可使用那个方法的默认实现执行动画;若是是咱们自定义的遵照CAAction协议的对象,就必须让自定义的对象去实现那个方法来执行动画。
咱们在那替换为本身写的action对象取决于咱们打算如何调整Layer。代理
- (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(咱们能够临时禁止Layer的actions。当咱们改变Layer的属性,核心动画一般建立隐式的transaction对象,而后执行动画式的过分变化;若是咱们不想要这个默认的动画执行,经过建立显式的transaction和设置他的 kCATransactionDisableActions 属性为true,就能够达到禁止隐式动画的目的了。代码6-2展现了当从图层树上移除指定的Layer的时候,咱们禁止隐式动画的一段代码。code
[CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; [aLayer removeFromSuperlayer]; [CATransaction commit];
关于更多使用transaction对象管理动画行为的信息参见:显式动画帮助咱们改变更画参数。htm