好的,最近我做了一个类似于重力计时器的项目,
int speed = 5;
NSTimer *gravitytimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(gravity) userInfo:nil repeats:YES];
-(void)gravity {
image.center = CGPointMake(image.center.x, image.center.y - speed)
}
问题是速度不断增加或不断增加,图像越来越快。我不知道问题是什么。如果这是一个糟糕的问题,我很新手很抱歉。感谢所有花时间回答的人。
答案 0 :(得分:1)
当你创建一个计时器时,它将尝试每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
)。另外,BTW,显示器的帧速率是60fps,因此尝试更频繁地调用它是没有意义的。