我有一些关于nstimer和ui更新和绘图的问题,我有一个视图控制器并在里面放了一个计时器,它每0.02秒运行一次,在这个计时器计时功能中,我让一个图像视图从上到下移动(改变视图的中心),然后添加另一个视图,当触摸在这个视图上开始触摸移动和触摸结束时,画一条线,并调用setneedsdisplay,当我的手指在视图上移动时,我前面提到的图像视图移动得更慢,通过检查时间节拍,我发现,没有手指在上面,它会滴答0.02秒,但当继续移动时,它会减慢到大约0.1秒。这使得图像视图移动较慢,任何其他优化它的方法,我认为设置需要显示做了厚,当然,我试图改变运行循环模式
[[NSRunLoop currentRunLoop] addTimer:tickTimer forMode:NSDefaultRunLoopMode];不是帮助。请帮助,另一个问题是,另一个线程会帮助这一点吗?我试过nsthread,似乎没什么用...LOL
发布于 2013-11-08 20:21:18
为此,更好的解决方案是CADisplayLink,它在每次要刷新帧时调用一个方法。这样你就可以避免计时器和实际帧速率之间的不同步。
您可以设置一个显示链接,例如:
_dl = [CADisplayLink displayLinkWithTarget: self selector:@selector(refreshFrame)];
[_dl addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_dl setPaused:NO];在refreshFrame回调中,您可以更新屏幕。您可以使用duration和frameInterval来计算自上次刷新以来经过的时间,并相应地调整移动速度:
-(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;
}这样,即使帧速率随时间变化,视图的速度也保持不变。
发布于 2013-11-08 19:42:28
假设计时器事件将以确切的间隔调用是错误的。根据上次更新的速度和速度向量以及时间计算新参数。
https://stackoverflow.com/questions/19857054
复制相似问题