2

当计时器正在运行并且我试图在屏幕上拖动一个按钮时,我的计时器会滞后。这很明显,因为计时器是移动图像。

有没有办法通过改变一些东西来解决这个问题,还是我必须改变我的整个项目?

4

2 回答 2

1

I'd suggest either using CoreAnimation (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/introduction/introduction.html) or for simple animations, UIView's animateWithDuration:animations method (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/clm/UIView/animateWithDuration:animations:).

The reason for this is that the Apple frameworks attempt to keep the animation timing correct and smooth, regardless of external events. In other words, if an external event causes the animation to drop some frames, the framework still produces a relatively nice looking animation by properly interpolating the animation over the specified duration.

If you want to stick with timers, do the interpolation yourself:

  1. Remember the time at the beginning of your animation
  2. Fire the timer at a regular interval
  3. Based the difference between the new time and the original time, calculate where your image should be taking into account the total duration of the animation and the distance it needs to travel

This will produce a smoother result than a simple "move the image X pixels every Y milliseconds" approach and it will ensure the animation runs in exactly the specified duration.

于 2013-10-30T22:41:18.963 回答
0

NSTimer被实现为运行循环上的一个事件。它没有对何时触发做出任何承诺,也不适合任何时间紧迫的事情。如果你NSTimer每秒有一次以上的射击,那么你可能将它用于错误的事情。如果你做了一些导致运行循环不能快速处理的事情,你肯定会遇到计时器问题。

平移手势识别器可以向主运行循环发送大量消息。这通常很好,但特别是如果您在移动回调中进行了重要的工作,您肯定会破坏您的计时器。

正确的解决方案通常是使用 UIView 动画、Core Animation 或 UIKit Dynamics 在屏幕上移动东西。这就是构建这些工具的目的。@ksimons 提供了一些很好的链接。对于快速触发的非动画动作,GCD 计时器通常是比NSTimer.

如果您需要计时器来更新屏幕,您应该始终使用CADisplayLink而不是NSTimer. 人们常犯的一个错误是安排一个NSTimer比屏幕更新更快的更新。CADisplayLink最适合自定义绘图情况,而不是动画。同样,有非常好的动画框架可用。

于 2013-10-31T03:21:47.337 回答