Skip to content

什么情况下会有隐式动画,为什么会有隐式动画 #149

Open
@tbfungeek

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];

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions