首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减慢CADisplayLink间隔

减慢CADisplayLink间隔
EN

Stack Overflow用户
提问于 2015-12-30 22:07:21
回答 2查看 2.3K关注 0票数 2

我在我的iOS应用程序中使用了NSTimer,但是由于SetNeedsDisplay的原因,我没有得到我想要的结果。

我做了一些研究,找到了CADisplayLink,它给了我想要的动画效果。遗憾的是,我不能像NSTimer那样设置定时器。

代码语言:javascript
复制
[NSTimer scheduledTimerWithTimeInterval:0.250 target:self selector:@selector(setGaugeLevel) userInfo:nil repeats:YES];

我的CADisplayLink调用我的函数太快了,我想给它设置与我使用NSTimer时相同的计时器(0.250秒)。

代码语言:javascript
复制
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setGaugeLevel)];
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

setGaugeLevel函数内部只有一个带有SetValue函数的循环,该函数在每次迭代中都包含:

代码语言:javascript
复制
[self setNeedsDisplay];

有没有办法放慢速度来得到我想要的结果?

EN

回答 2

Stack Overflow用户

发布于 2015-12-31 04:33:44

正如@carton所说,CADisplayLink是用来使你自己与显示器同步的。它不是一个通用的计时器。它特别适用于像实时视频这样的情况,在这种情况下,您希望以一种与同步刷新绑定的方式进行更新。这显然不是你的问题。

你所描述的方法没有多大意义。调用setNeedsDisplay不会导致视图立即重新绘制。它只是将其标记为在下一个绘制周期中重新绘制。在循环中调用setNeedsDisplay是没有意义的。setGaugeLevel必须返回,否则视图将永远不会更新(因为您将挂起UI队列)。

如果您只想让进度指示器以.25s为增量增加,那么只需增加进度指示器的值并返回即可。使用NSTimer来调用它。当计时器达到100%时,使计时器无效,以便停止计时器。

您甚至不需要调用setNeedsDisplay。进度指示器知道当它们的值发生变化时需要重新绘制它们。

票数 4
EN

Stack Overflow用户

发布于 2015-12-31 04:16:26

CADisplayLink与显示器刷新率相关,它(通常是?)以60 60运行,即每秒60帧。您不能控制它触发的时间间隔,但它有一个设置frameInterval的选项,允许您指定“在显示链接再次通知目标之前必须经过的帧数”。

在您的代码中,添加一行以将更新限制为大约每0.25s一次:

代码语言:javascript
复制
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setGaugeLevel)];
displayLink.frameInterval = 15 // 0.25s, assuming 60Hz display refresh rate
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

但是,如果您需要在不锁定显示刷新率的情况下精确计时,那么您最好的方法可能仍然是NSTimer。你遇到了什么问题?

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

https://stackoverflow.com/questions/34531111

复制
相关文章

相似问题

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