图层的每个改变都是事务的一部分。
CATransaction 是核心动画类,它负责成批的把多个图层树的修改作为一个原子更新到渲染树。
区分隐式动画和隐式事务:隐式动画通过隐式事务实现动画 。
区分显式动画和显式事务:显式动画有多种实现方式,显式事务是一种实现显式动画的方式。
1. 隐式事务
当图层树被没有获得事务的线程修改的时候将会自动创建隐式事务,当线程的运行循环(run-loop)执行下次迭代的时候将会自动提交事务。 但是,当在一个美誉运行循环(runloop)的县城修改图层的属性时,你必须使用显式事务.
一下皆是隐式事务
layer.backgroundColor = (layer.backgroundColor == redColor) ? blueColor : redColor;
layer.opacity = 1.0f;
layer.position = CGPointMake(layer.position.x +10, layer.position.y);
2.显式事务
在你修改图层树之前,可以通过给 CATransaction 类发送一个 begin 消息来创建一个显式事务,修改完成之后发送 comit 消息。显式事务在同时设置多个图层的属性的时候(例如当布局多个图层的时候),暂时的禁用图层的行为,或者暂时修改动画的时间的时候非常有用 .
[CATransaction begin];
[CATransaction setValue:(_swich.on?(id)kCFBooleanTrue:(id)kCFBooleanFalse) forKey:kCATransactionDisableActions];
[self setLayerBC];
[CATransaction commit];
3 .暂时禁用图层的行为
可以在修改图层属性值的时候通过设置事务的 kCATransactionDisableActions值为 YES 来暂时禁用图层的行为。在事务范围所作的任何更改也不会因此而发生的动画。
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
[CATransaction setDisableActions:_swich.on];这种方法控制区直到函数的结束
4 .重载隐式动画的时间
你可以暂时改变响应改变图层属性的动画的时间,通过设置事务的kCATransactionAnimationDuration 键的值为新的时间。事务范围内所产生的任何动画都会使用该新设置的时间值而不是他们原有的值。
[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
forKey:kCATransactionAnimationDuration];
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:4.0f]
forKey:kCATransactionAnimationDuration];//设定隐式事务处理时间
if (_swich.layer.position.x == 80) {
_swich.layer.position = CGPointMake(40,300);
}
else
{
_swich.layer.position = CGPointMake(80, 80);
}
[CATransaction commit];
其他可以参见http://www.cnblogs.com/bandy/archive/2012/03/26/2418165.html
以及 <<核心动画编程指南>>
源码: https://github.com/robin2013/CATransaction_Study