NSTimer - 整数乘法

时间:2014-10-06 02:38:00

标签: ios objective-c nstimer

好的,最近我做了一个类似于重力计时器的项目,

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)
}

问题是速度不断增加或不断增加,图像越来越快。我不知道问题是什么。如果这是一个糟糕的问题,我很新手很抱歉。感谢所有花时间回答的人。

1 个答案:

答案 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,因此尝试更频繁地调用它是没有意义的。