观察CALayer中的动画属性更改

Gle*_*Low 27 iphone macos core-animation objective-c calayer

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

  1. 我试图在使用国际志愿者组织(键值观察)presentationLayerbounds.origin的keyPath.系统抱怨在释放观察者之前释放了对象,这使我认为表示层只是临时的.观察presentationLayer.bounds.origin为密钥路径不起作用.

  2. 我尝试在另一个图层上创建一个属性并为其设置动画,例如通过声明@property@dynamic在该图层上创建它.但是,只有在访问表示层时(例如,在动画结束时)才会更改此新属性,但在动画运行时它似乎不会更新.

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

    • 它仅在CALayer具有非零帧时才有效.由于该层可能是CAShapeLayer或子类,因此它可能具有零帧.
    • 看起来它触发setNeedsDisplay了该层,但由于我实际上并没有绘制该层只监视属性更改,我不想让它重绘.
  4. 我试过安排一个NSTimer,并在定时器回调样本中presentationLayer.这也适用于这些问题:

    • 计时器可能与动画更新略有不同步.
    • 由于偶尔会有原始动画被另一个动画抢占,因此在动画运行时以及仅在动画运行时才能实际触发定时器.

有什么建议?所有这些都将在iPhoneOS 3.0/3.1上.

Mat*_*ong 5

我想你已经列出了所有的可能性.事实上,我甚至都没有意识到#2和#3,而且我在Core Animation上了这本书.;-)

KVO不适用于这些房产.如果是的话会很好,但我相信这样做的原因与它需要的开销有关.该值将非常频繁地更新,并且必须回调给任何观察者.

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

最好的祝福.

  • 例如,请参阅:http://developer.apple.com/mac/library/qa/qa2004/qa1385.html.Apple doc说"NSTimer是一个通用定时器.它不是一个与显示设备相连的定时器.间隔和定时器开始触发的瞬间与垂直刷新发生的时间无关.这意味着简单的方法以"60.0"Hz创建定时器注定要失败 - 定时器将相对于实际刷新率漂移,并且您将丢弃或加倍帧.这也意味着定时器在任意点调用应用程序进入刷新......" (2认同)

mei*_*sel 5

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