Open
Description
-
在UIView的非主Layer的可动画属性发生变化的时候会自动触发duration为0.25s的隐式动画,
-
之所以有隐式动画是因为我们在修改Animatable Properties的时候CALayer都会调用actionForKey去查找并运行合适的action,action实际上是一些遵循了CAAction协议的对象,用于定义一个动画需要做的事情,
actionForLayer:forKey:有三种返回情况:
1. 返回CAAction的对象,这时候将会使用这个CAAction来实现这个动画
2. 返回NSNull,这时候就会停止搜索,并且告诉layer不需要执行任何动画
3. 返回nil,这时候layer就会继续往下找
4. 查找layer的action属性,看可以是否有对应的值
5. 查找layer的style属性。
6. 调用defaultActionForKey返回对应key的默认action,一般是CABasicAnimation。
找到action对象后,调用action对象的runActionForLayer:object:arguments:方法执行相关操作
之所以Root Layer没有隐式动画而非Root Layer会有隐式动画了,其实最大的玄机在于CALayer的delegate对象,我们知道Root Layer的delegte是对应的UIView,因此可以推测之所以Root Layer没有隐式动画就是因为UIView在一般情况下actionForLayer:forKey返回一个 NSNull,只有当属性改变发生在动画block 中时,view 才会返回实际的动作。而非Root Layer,delegate在不设置的情况下为空,所以返回的是通过defaultActionForKey返回的对应key的默认Action.
- 取消隐式动画的方式如下:
[CATransaction begin];
// 关闭隐式动画
[CATransaction setDisableActions:YES];
//原本会产生隐式动画的部分
[CATransaction commit];
Metadata
Metadata
Assignees
Labels
No labels
Activity