首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NStimer和setNeedsDisplay

NStimer和setNeedsDisplay
EN

Stack Overflow用户
提问于 2013-11-08 18:43:29
回答 2查看 477关注 0票数 0

我有一些关于nstimer和ui更新和绘图的问题,我有一个视图控制器并在里面放了一个计时器,它每0.02秒运行一次,在这个计时器计时功能中,我让一个图像视图从上到下移动(改变视图的中心),然后添加另一个视图,当触摸在这个视图上开始触摸移动和触摸结束时,画一条线,并调用setneedsdisplay,当我的手指在视图上移动时,我前面提到的图像视图移动得更慢,通过检查时间节拍,我发现,没有手指在上面,它会滴答0.02秒,但当继续移动时,它会减慢到大约0.1秒。这使得图像视图移动较慢,任何其他优化它的方法,我认为设置需要显示做了厚,当然,我试图改变运行循环模式

代码语言:javascript
复制
      [[NSRunLoop currentRunLoop] addTimer:tickTimer forMode:NSDefaultRunLoopMode];

不是帮助。请帮助,另一个问题是,另一个线程会帮助这一点吗?我试过nsthread,似乎没什么用...LOL

EN

回答 2

Stack Overflow用户

发布于 2013-11-08 20:21:18

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

您可以设置一个显示链接,例如:

代码语言:javascript
复制
_dl = [CADisplayLink displayLinkWithTarget: self selector:@selector(refreshFrame)];
[_dl addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_dl setPaused:NO];

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

代码语言:javascript
复制
-(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
EN

Stack Overflow用户

发布于 2013-11-08 19:42:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19857054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档