观察CALayer中的动画属性更改
我有一个CABasicAnimation
来动画CALayer
的属性,例如bounds.origin
。 我希望能够观察随着时间的推移而变化的财产,但还没有真正找到一种100%有效的方法。
我尝试在presentationLayer
的bounds.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