代码之家  ›  专栏  ›  技术社区  ›  Jan Fritz

旧的Calayer动画保持应用

  •  0
  • Jan Fritz  · 技术社区  · 6 年前

    我对卡莱尔动画有个奇怪的问题。导致此情况的操作列表:

    • 我将不透明动画添加到 CALayer ( CAKeyframeAnimation )填充模式存在 kCAFillModeForwards kCAFillModeRemoved 没什么区别。
    • 要调整该层的大小(例如在屏幕旋转之后),我会在 X 设置 卡莱尔 beginTime timeOffset 0 (只是确定)然后打电话 removeAllAnimations() 在那一层。
    • 我更新 frame 一层的。
    • 然后添加新的不透明度动画。

    问题是:图层的大小和不透明度动画是正确的 之后 时间 X ,在此之前,它被卡在完全不透明和它的旧大小!这真的很奇怪,因为大小从来没有动画,我改变了大小,而没有动画应用到层。

    所有的超层都有 beginTime == 0 timeOffset == 0 .

    为什么会这样?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jan Fritz    6 年前

    我找到了失败的原因。如果布局发生变化,例如屏幕旋转,操作系统会通过“操作”自动将所有层、ui视图等设置为新状态的动画。它们被添加到已经存在的动画中,如果用户已经添加了自己的动画,则完全忽略。问题是:这只适用于最简单的情况,如果你有一点更复杂的动画,你的动画会被破坏。 要阻止操作系统干扰动画,只需指定 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()]
    

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

    如果你阅读了核心动画的教程和文档,你将不会发现任何警告,以注意“动作”动画干扰你的东西,所以这不是一个明显的解决方案,但它的工作。