旧CALayer动画保持应用

时间:2018-06-15 11:30:12

标签: ios core-animation

我对CALayer动画有一个奇怪的问题。导致此行为的行动清单:

  • 我向CALayerCAKeyframeAnimation)添加了不透明度动画。 FillMode为kCAFillModeForwardskCAFillModeRemoved没有任何区别。
  • 要调整该图层的大小(例如在屏幕旋转后),我会在X时暂停动画,将CALayer beginTimetimeOffset设置为{{1} (只是为了确定)并在该图层上调用0
  • 我更新了图层的removeAllAnimations()
  • 然后我添加新的不透明度动画。

问题是:图层具有正确的尺寸,不透明度动画仅在时间frame之后,之前它已陷入完全不透明并且具有旧尺寸!这真的很奇怪,因为大小从未动画过,我改变了大小而没有动画应用于图层。

此外,所有超级层都有XbeginTime == 0

为什么会这样?

1 个答案:

答案 0 :(得分:0)

我发现了为什么失败了。如果布局发生变化,例如通过旋转屏幕,OS会通过“动作”自动将所有图层,UIView等设置为新状态。它们被添加到已经存在的动画中,完全忽略用户是否已经添加了自己的动画。问题是:这仅在最简单的情况下有效,如果您的动画有些复杂,动画就会坏掉。 要阻止操作系统干扰动画,只需将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()]

阻止大多数操作被操作系统添加(此列表可能不完整)。

如果您阅读了Core Animation的教程和文档,则不会发现任何警告来寻找干扰您的东西的“动作”动画,因此这不是一个显而易见的解决方案,但它可以工作。