NStimer和setNeedsDisplay

时间:2013-11-08 10:43:29

标签: ios multithreading nstimer drawrect

我对nstimer和ui更新和绘制有一些问题, 我有一个viewcontroller并在里面放一个计时器,它每0.02秒运行一次, 在这个计时器滴答功能中,我使一个imageview从上到下移动(改变视图中心), 然后添加另一个视图,当触摸开始touchmove和touchend在这个视图上, 绘制一条线并调用setneedsdisplay,当我的fingure在视图上移动时,我之前提到的imageview,移动得更慢, 通过检查时间刻度,我发现,没有手指,它会嘀嗒0.02秒,但是什么时候 继续前进,它减慢到0.1秒,这使得imageview移动得更慢, 任何其他优化方式, 我认为setneedsdisplay做得很厚, 当然,我尝试用

更改runloop模式
      [[NSRunLoop currentRunLoop] addTimer:tickTimer forMode:NSDefaultRunLoopMode];

没有帮助。 请帮助,另一个问题是另一个线程会帮助这个吗? 我试过nsthread,似乎没有帮助....大声笑

2 个答案:

答案 0 :(得分:1)

为此目的,一个更好的解决方案是CADisplayLink,每次刷新一个帧时调用一个方法。这样你就可以避免定时器和实际帧速率之间的失步。

您可以设置显示链接,例如像这样:

_dl = [CADisplayLink displayLinkWithTarget: self selector:@selector(refreshFrame)];
[_dl addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_dl setPaused:NO];

并在refreshFrame回调中,您可以更新屏幕。您可以使用durationframeInterval来计算上次刷新时间,并相应地调整移动速度:

-(void) refreshFrame
{
    CGFloat speed = 10.0; //points per second
    CGFloat timePassed = (_dl.duration * _dl.frameInterval)];

    //refresh the view (example)
    CGPoint imageCenter = self.imageView.center;
    imageCenter y += speed * timePassed;
    self.imageView.center = imageCenter;
}

这样,即使帧速率随时间变化,视图的速度也会保持不变。

答案 1 :(得分:0)

假设将以精确的间隔调用计时器事件是错误的。根据速度和速度矢量以及上次更新的时间计算新参数。