PanGesture导致定时器滞后?

时间:2013-10-30 22:09:16

标签: ios

当计时器正在运行且我试图在屏幕上拖动按钮时,我的计时器会滞后。这是显而易见的,因为定时器是移动图像。

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

2 个答案:

答案 0 :(得分:1)

我建议使用CoreAnimation(https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/introduction/introduction.html)或简单的动画,UIView的animateWithDuration:animations方法(https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/clm/UIView/animateWithDuration:animations :)。

原因是Apple框架试图保持动画时序的正确和平滑,无论外部事件如何。换句话说,如果外部事件导致动画丢弃某些帧,框架仍会通过在指定的持续时间内正确插入动画来生成相对漂亮的动画。

如果您想坚持使用计时器,请自行进行插值:

  1. 记住动画开头的时间
  2. 定期点火计时器
  3. 根据新时间与原始时间之间的差异,计算图像应考虑动画的总持续时间以及需要行进的距离
  4. 这将产生比简单的“每Y毫秒移动图像X像素”方法更平滑的结果,并且它将确保动画在指定的持续时间内运行。

答案 1 :(得分:0)

NSTimer作为运行循环上的事件实现。它没有任何关于什么时候会发射的承诺,也不适用于任何时间关键的东西。如果你的NSTimer每秒发射不止一次,你可能会将它用于错误的事情。如果你做的事情导致运行循环不能快速处理,你肯定会遇到计时器问题。

平移手势识别器可以向主运行循环发送大量消息。这通常很好,但特别是如果你在移动回调中做了非平凡的工作,你肯定会扰乱你的计时器。

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

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