CATransaction事务管理

CATransaction 事务类,可以对多个layer的属性同时进行修改.它分隐式事务,和显式事务.

隐式动画是通过隐式事务实现动画的,显式动画有多种实现方式,显式事务是其中一种实现显式动画的方式。

隐式事务

除显式事务外,任何对于 CALayer 属性的修改,都是隐式事务.这样的事务会在 RunLoop 中被提交.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (void)viewDidLoad {
// 初始化一个layer,添加到主视图
layer=[CALayer layer];
layer.bounds = CGRectMake(0, 0, 200, 200);
layer.position = CGPointMake(160, 250);
layer.backgroundColor = [UIColor redColor].CGColor;
layer.borderColor = [UIColor blackColor].CGColor;
layer.opacity = 1.0f;
[self.view.layer addSublayer:layer];
[super viewDidLoad];
}

-(IBAction)changeLayerProperty
{
// 设置圆角
layer.cornerRadius = (layer.cornerRadius == 0.0f) ? 30.0f : 0.0f;
// 设置透明度
layer.opacity = (layer.opacity == 1.0f) ? 0.5f : 1.0f;
}

显式事务

在你修改图层树之前,可以通过给 CATransaction 类发送一个 begin 消息来创建一个显式事务,修改完成之后发送 comit 消息。

显式事务在同时设置多个图层的属性的时候(例如当布局多个图层的时候),暂时的禁用图层的动画,或者暂时修改动画的时间的时候非常有用。

一般使用

1
2
3
4
5
6
// 如果要关掉动画,将代码放到下面事务内部:
[CATransaction begin]; // 开启事务
[CATransaction setDisableActions:YES];
self.layer.position = CGPointMake(100, 100);
self.layer.opacity = 0.5;
[CATransaction commit]; // 提交事务

如何禁用图层(非根层)行为

1
2
3
4
5
6
7
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];

另一种禁用图层行为的方法是
[CATransaction setDisableActions:_swich.on];这种方法控制区直到函数的结束

设置重载隐式动画的时间

你可以暂时改变响应改变图层属性的动画的时间,通过设置事务的kCATransactionAnimationDuration 键的值为新的时间。事务范围内所产生的任何动画都会使用该新设置的时间值而不是他们原有的值。

1
2
[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
forKey:kCATransactionAnimationDuration];

注意:非根层图层才能用 CATransaction 修改这些属性。

文章作者: Ammar
文章链接: http://lizhaoloveit.cn/2014/07/24/CATransaction%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ammar's Blog
打赏
  • 微信
  • 支付宝

评论