Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 由于PanGesture导致计时器滞后?_Ios - Fatal编程技术网

Ios 由于PanGesture导致计时器滞后?

Ios 由于PanGesture导致计时器滞后?,ios,Ios,当计时器运行时,我试图在屏幕上拖动一个按钮,我的计时器就会滞后。这很明显,因为计时器是运动图像 有没有办法通过改变一些东西来解决这个问题,或者我必须改变我的整个项目?我建议使用CoreAnimation()或者对于简单的动画,UIView的animateWithDuration:animations方法(:) 这是因为Apple框架试图保持动画计时的正确性和流畅性,而不考虑外部事件。换句话说,如果外部事件导致动画删除某些帧,则框架仍会通过在指定的持续时间内正确插值动画来生成相对美观的动画 如果您

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


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

我建议使用CoreAnimation()或者对于简单的动画,UIView的
animateWithDuration:animations
方法(:)

这是因为Apple框架试图保持动画计时的正确性和流畅性,而不考虑外部事件。换句话说,如果外部事件导致动画删除某些帧,则框架仍会通过在指定的持续时间内正确插值动画来生成相对美观的动画

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

  • 还记得动画开始时的时间吗
  • 按固定间隔启动计时器
  • 根据新时间和原始时间之间的差异,计算图像应在何处移动,同时考虑动画的总持续时间及其需要移动的距离

  • 这将产生比简单的“每Y毫秒移动图像X像素”方法更平滑的结果,并将确保动画在指定的持续时间内准确运行。

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

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

    正确的解决方案通常是使用UIView动画、核心动画或UIKit Dynamics在屏幕上移动对象。这就是这些工具的用途@卡西蒙斯提供了一些很好的链接。对于快速触发的非动画动作,GCD计时器通常是比
    NSTimer
    更好的解决方案

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