观察CALayer中的动画属性更改

我有一个CABasicAnimation来动画CALayer的属性,例如bounds.origin 。 我希望能够观察随着时间的推移而变化的财产,但还没有真正找到一种100%有效的方法。

  • 我尝试在presentationLayerbounds.origin keypath上使用KVO(键值观察)。 系统抱怨说,在观察者被释放之前,对象被释放,导致我认为表示层只是暂时的。 将presentationLayer.bounds.origin作为keypath观察不起作用。

  • 我试图在另一个图层上创建一个属性,并通过在该图层上声明@dynamic @property@dynamic来动画化。 然而,当访问表示层时(例如在动画结束时),这个新属性只会被改变,但在动画运行时似乎没有更新。

  • 我在#2中的属性上使用了needsDisplayForKey ,它在动画期间触发更新,但对于这些问题:

  • 它只适用于CALayer具有非零帧的情况。 由于此图层可能是CAShapeLayer或子类,因此它可能具有零帧。
  • 它看起来像触发了该层的setNeedsDisplay ,但由于我实际上并没有绘制该层只监视属性更改,我不想让它重绘。
  • 我试着调度一个NSTimer ,并在定时器回调中对presentationLayer采样。 这也适用于这些问题:

  • 计时器可能会与动画更新略有不同步。
  • 由于有时候原始动画会被另一个动画取代,所以在动画运行时以及动画运行时很难启动计时器。
  • 有什么建议么? 所有这些都将在iPhoneOS 3.0 / 3.1上。


    我想你已经命名了所有的可能性。 事实上,我甚至没有意识到#2和#3,我写了关于核心动画的书。 ;-)

    KVO不适用于这些属性。 如果是这样,会很好,但我相信这样做的原因与它需要的开销有关。 该值会更新得非常频繁,必须回复任何观察员。

    无论如何,我发现NSTimer是最可靠的方法,但现在我不确定你说了什么。 是什么让你认为定时器不同步? 为什么难以让计时器只在动画运行时触发? 你不能仅仅在定时器回调中检查你想要的条件,并且如果条件不满足则不做任何事情?

    最好的祝福。


    尝试使用CADisplayLink,该设计旨在与动画循环保持同步。 更多信息:https://ashfurrow.com/blog/animating-views-with-cadisplaylink/

    链接地址: http://www.djcxy.com/p/74159.html

    上一篇: Observing animated property changes in a CALayer

    下一篇: UIView animation vs CALayers