gpt4 book ai didi

ios - NStimer 和 setNeedsDisplay

转载 作者:行者123 更新时间:2023-11-29 03:30:30 25 4
gpt4 key购买 nike

我在 nstimer 和 ui 更新以及drawrect 方面遇到一些问题,我有一个 View Controller 并在里面放了一个计时器,它每 0.02 秒运行一次,在这个计时器滴答功能中,我使 ImageView 从上到下移动(更改 View 中心),然后添加另一个 View ,当触摸开始触摸移动并触摸结束时在此 View 上,画一条线并调用setneedsdisplay,当我的手指在 View 上移动时,我之前提到的imageview移动得更慢,通过检查时间刻度,我发现,没有手指放在上面时,它会滴答0.02秒,但是当继续,它减慢到大约 0.1 秒,这使得 ImageView 移动得更慢,任何其他方式来优化它,我认为 setneeddisplay 做得很厚,当然,我尝试用

更改运行循环模式
      [[NSRunLoop currentRunLoop] addTimer:tickTimer forMode:NSDefaultRunLoopMode];

没有帮助。请帮忙,另一个问题是另一个线程会帮助这个吗?我尝试了 nsthread,似乎没有帮助......哈哈

最佳答案

为此,一个更好的解决方案是 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;
}

这样,即使帧速率随时间变化, View 速度也保持不变。

关于ios - NStimer 和 setNeedsDisplay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19857054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com