当您创建一个计时器,而这将尝试调用它每隔0.01秒,你实际上有没有保证,这将是在这个速度正是所谓的(即,如果时间过长,则可能跳过一个或两个;如果主线程被阻塞做其他事情(并且在应用程序首次启动时它非常忙碌),那么您可能会跳过很多)。您可以请求每秒更新image.center
100次,但您不能保证这实际上最终会被调用的频率。
如果您想要使用此技术进行动画制作,请按照将动画的速度与计时器选择器的频率隔离的方式实际调用。所以,你可以捕捉开始时间,例如
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
CGPoint startPoint = image.center;
,然后在定时程序,你会捕捉所经过的时间,乘以你的速度时间经过的时间,并从那里:
-(void)gravity {
CFAbsoluteTime elapsed = CFAbsoluteTimeGetCurrent() - self.start;
CGFloat speed = 100.0; // e.g. 100 points per second
CGPoint center = startPoint;
center.y += (elapsed * speed);
image.center = center;
}
顺便说一句,我假设这只是定时器的练习。如果这是一个真正的动画,有很多更有效的方法来做这样的动画(例如基于块的animateWithDuration
,UIKit动态,如果你真的想做一些基于定时器的东西,你通常会使用CADisplayLink
而不是NSTimer
) 。另外,顺便说一下,显示器的帧速率是60fps,所以没有必要比它更频繁地调用它。
来源
2014-10-06 02:52:12
Rob
该整数位于头文件中,这只是为了向您显示。 – Xcoder 2014-10-06 02:38:26
您显示的代码不会使图像变得越来越快。尝试在更长的时间间隔内,看看你是否仍然认为它正在加速。 – rdelmar 2014-10-06 02:48:07
了解如何使用调试器和断点。你可以安排多个定时器。 – 2014-10-06 02:49:12