核心动画的不可预知行为(CABasicAnimation)

我正在给iOS写一行动画,其中一行在CALayer上绘制为CGPath中的一组点。 该线从平面位置动画到具有不同y坐标的“模制”形状,但总是具有相同的x坐标,就像线形图动画一样。

为了让点插值更容易,我将一个自定义的CGFloat属性添加到了我的CALayer子类中。 我把这个属性称为“animator”(一个更好的名字可能是进步,插入等)。这个想法是在0.0f到1.0f这个属性上添加一个简单的CABasicAnimation,这样我就可以使用Core Animation的定时功能和插值支持仍然能够轻松编写自定义动画。 例如,如果一条线的点从y = 100到y = 130,那么当动画制作者在0.0f时,当它的1.0f处于100时,我在130处,临时值给我我的临时点,而我不断重新绘制这些新点,以获得我的动画。

现在动画工作正常,我已禁用图层操作,添加needsDisplayForKey等,但我的问题是核心动画是不准确的。 动画师的最终价值有时是.95 .96等而不是1.0。 那么这是好的,因为浮点数有准确性问题,但是当我的模型值得到更新(设置为1.0f,然后将动画添加到图层)线应重新绘制,我应该得到一个准确的视觉效果。

这是另一个问题出现的地方。 有时动画不会立即删除。 大多数时候它立即被删除,我没有任何问题,但有时会持续几秒钟,有时甚至几分钟。 为了测试我的理论,即动画没有被删除,我添加了一个简单的BOOL标志给我的图层,当我们在表现层上时返回YES,并且当我看到我最后一次drawInContext调用在表现层上时,它的animator值为0.98967f或什么的,最后的drawInContext调用动画1.0f和表示层标志是否会发生很多晚。 因此,我的视觉跳跃,除了明显的可怕的用户体验,是不准确的。

我试图尽我所能地解释我的问题,如果有人希望看到代码,我会很乐意提供我的测试项目。 希望一些聪明的人看到这一点,并能帮助我。

编辑1:在这里上传了整个Xcode项目(包括我讨厌的编辑,以显示我所尝试的)。

编辑2:有类似问题的人在完成时手动删除动画http://lucas.tiz.ma/blog/2012/04/18/core-animation-is-a-bit-garbage-collection-y/

谢谢。


tl; dr在animationDidStop:finished:delegate回调中显式调用setNeedsDisplay。

根据Lucas Tizma的帖子(请参阅上面的编辑2),我尝试手动删除动画。 我选择了比他的基于块的方法更简单的方法,即将图层设置为设置在其上的动画的代表。 这样,动画开始和停止回调就直接进入相关层。 明确地删除animationDidStop中的动画:finished:回调并不能解决问题。 例如有时(参见下面的日志,特别是时间戳记),动画将停止,并检查它是否已被移除,但显示它已被移除,但实际模型值的准确绘制会在很晚之后发生。

// animationDidStop:finished: call back code

NSLog(@"layer animation stopped");

// check if any animations exist
NSLog(@"animation keys: %@", [self animationKeys]);

// remove animations and check
NSLog(@"removing animations");
[self removeAllAnimations];
NSLog(@"animation keys: %@", [self animationKeys]);

// log

2012-10-11 11:47:16.774 ASPathAnimationTest[3017:c07] on presentation layer 1
2012-10-11 11:47:16.774 ASPathAnimationTest[3017:c07] 335 animation draw update, animator is 0.982606
2012-10-11 11:47:16.775 ASPathAnimationTest[3017:c07] startPoint: {100, 90} - endPoint: {100, 100} - newPoint: {100, 99.8261}
<snip>
2012-10-11 11:47:16.791 ASPathAnimationTest[3017:c07] startPoint: {1000, 50} - endPoint: {1000, 100} - newPoint: {1000, 99.1303}
2012-10-11 11:47:16.792 ASPathAnimationTest[3017:c07] layer animation stopped
2012-10-11 11:47:16.792 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.793 ASPathAnimationTest[3017:c07] removing animations
2012-10-11 11:47:16.793 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.794 ASPathAnimationTest[3017:c07] layer animation stopped
2012-10-11 11:47:16.794 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.794 ASPathAnimationTest[3017:c07] removing animations
2012-10-11 11:47:16.795 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.795 ASPathAnimationTest[3017:c07] layer animation stopped
2012-10-11 11:47:16.819 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.820 ASPathAnimationTest[3017:c07] removing animations
2012-10-11 11:47:16.820 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.821 ASPathAnimationTest[3017:c07] layer animation stopped
2012-10-11 11:47:16.821 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.821 ASPathAnimationTest[3017:c07] removing animations
2012-10-11 11:47:16.822 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.822 ASPathAnimationTest[3017:c07] layer animation stopped
2012-10-11 11:47:16.822 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:47:16.823 ASPathAnimationTest[3017:c07] removing animations
2012-10-11 11:47:16.823 ASPathAnimationTest[3017:c07] animation keys: (null)
2012-10-11 11:48:00.000 ASPathAnimationTest[3017:c07] on presentation layer 0
2012-10-11 11:48:00.000 ASPathAnimationTest[3017:c07] 336 animation draw update, animator is 1.000000
<snip, there are 5 lines so draw and point logs go here>
2012-10-11 11:48:00.021 ASPathAnimationTest[3017:c07] 340 animation draw update, animator is 1.000000
2012-10-11 11:48:00.023 ASPathAnimationTest[3017:c07] startPoint: {100, 90} - endPoint: {100, 100} - newPoint: {100, 100}
<snip>
2012-10-11 11:48:00.026 ASPathAnimationTest[3017:c07] startPoint: {1000, 50} - endPoint: {1000, 100} - newPoint: {1000, 100}

在看到日志并注意到动画真的被移除的事实之后,它只是用实际的准确模型值重新绘制有时不会发生,直到秒或甚至几分钟后,我改变了animationDidStop:finished:delegate回调到显式调用图层上的setNeedsDisplay。 答对了。

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

上一篇: Unpredictable behavior with Core Animation (CABasicAnimation)

下一篇: How exactly to subclass CALayer and use a custom property?