在CALayer的属性发生变化时会被调用,然后会根据对应的event来寻找一个遵循 CAAction协议的对象,寻找流程如下:
如果CALayer的delegate存在并实现了 actionForLayer:forKey:方法,那么调用该方法寻找;
从CALayer的actions字典中根据event为key值寻找;
从CALyaer的style层级中的actions字典中根据event为key值寻找;
调用类方法 +defaultActionForKey:方法寻找。
在以上步骤中,只要有一步找到action,那么就停止。
@interface TestView : UIView
@end
@implementation TestView
- (nullable id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
// return [NSNull null];
id k = [super actionForLayer:layer forKey:event];
return k;
}
@end
//修改 TestView.layer 实例对象的 position,并不会有动画,UIView 的root layer 不会有隐式动画。
//原因,上面代码打断点 发现 k 是 NSNull 的一个实例。在这里截断了。所以没有动画。
mark :
https://blog.youkuaiyun.com/TuGeLe/article/details/103412222
https://blog.youkuaiyun.com/jeffasd/article/details/50630574
本文深入解析CALayer如何处理动画事件,详细介绍了当CALayer属性变化时,系统如何根据一系列流程寻找遵循CAAction协议的对象来触发动画。流程包括检查delegate、actions字典、style层级以及默认类方法。通过具体代码示例,揭示了为何某些情况下动画可能不会被触发的原因。
6726

被折叠的 条评论
为什么被折叠?



