旧的 CALayer 动画保持应用
Old CALayer animation stays applied
我对 CALayer 动画有一个奇怪的问题。导致此操作的列表:
- 我将不透明动画添加到
CALayer
(CAKeyframeAnimation
)。 FillMode 为 kCAFillModeForwards
或 kCAFillModeRemoved
没有区别。
- 要调整该层的大小(例如在屏幕旋转之后),我在时间
X
暂停动画,将 CALayer
beginTime
和 timeOffset
设置为 0
(只是为了确定)并在该层上调用 removeAllAnimations()
。
- 我更新图层的
frame
。
- 然后我添加新的不透明度动画。
问题是:图层大小正确,不透明度动画仅在 时间 X
之后,在此之前,它卡在完全不透明状态并且具有旧大小!这真的很奇怪,因为尺寸从来没有动画过,我在没有动画应用到图层的情况下改变了尺寸。
而且所有的超级层都有beginTime == 0
和timeOffset == 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" 动画干扰您的内容,因此这不是一个明显的解决方案,但它有效。
我对 CALayer 动画有一个奇怪的问题。导致此操作的列表:
- 我将不透明动画添加到
CALayer
(CAKeyframeAnimation
)。 FillMode 为kCAFillModeForwards
或kCAFillModeRemoved
没有区别。 - 要调整该层的大小(例如在屏幕旋转之后),我在时间
X
暂停动画,将CALayer
beginTime
和timeOffset
设置为0
(只是为了确定)并在该层上调用removeAllAnimations()
。 - 我更新图层的
frame
。 - 然后我添加新的不透明度动画。
问题是:图层大小正确,不透明度动画仅在 时间 X
之后,在此之前,它卡在完全不透明状态并且具有旧大小!这真的很奇怪,因为尺寸从来没有动画过,我在没有动画应用到图层的情况下改变了尺寸。
而且所有的超级层都有beginTime == 0
和timeOffset == 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" 动画干扰您的内容,因此这不是一个明显的解决方案,但它有效。