旧的 CALayer 动画保持应用

Old CALayer animation stays applied

我对 CALayer 动画有一个奇怪的问题。导致此操作的列表:

问题是:图层大小正确,不透明度动画仅在 时间 X 之后,在此之前,它卡在完全不透明状态并且具有旧大小!这真的很奇怪,因为尺寸从来没有动画过,我在没有动画应用到图层的情况下改变了尺寸。

而且所有的超级层都有beginTime == 0timeOffset == 0

为什么会这样?

我发现了失败的原因。如果布局发生变化,例如随着屏幕旋转,OS 会通过 "actions" 自动将所有图层、UIView 等设置为新状态。它们被添加到已经存在的动画中,完全忽略用户是否已经添加了自己的动画。问题是:这只适用于最简单的情况,如果你有稍微复杂一点的动画,你的动画就会被破坏。 要阻止 OS 干扰您的动画,只需将您的 CALayer actions 属性 分配给

["bounds": NSNull(),
 "contents": NSNull(),
 "contentsGravity": NSNull(),
 "contentsScale": NSNull(),
 "fontSize": NSNull(),
 "hidden": NSNull(),
 "onLayout": NSNull(),
 "onOrderIn": NSNull(),
 "onOrderOut": NSNull(),
 "position": NSNull(),
 "speed": NSNull(),
 "timeOffset": NSNull()]

这会阻止 OS 添加大多数操作(此列表可能不完整)。

如果您阅读 Core Animation 的教程和文档,您将不会发现任何警告以注意 "actions" 动画干扰您的内容,因此这不是一个明显的解决方案,但它有效。