减慢CADisplayLink间隔时间

时间:2015-12-30 14:07:21

标签: ios intervals slowdown cadisplaylink

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

我做了一些研究,找到了CADisplayLink,它给了我想要动画的结果。可悲的是,我无法像NSTimer一样设置计时器。

[NSTimer scheduledTimerWithTimeInterval:0.250 target:self selector:@selector(setGaugeLevel) userInfo:nil repeats:YES];

我的CADisplayLink调用我的功能太快了,我想给它一个与我使用NSTimer时相同的计时器(0.250秒)。

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setGaugeLevel)];
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

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

[self setNeedsDisplay];

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

2 个答案:

答案 0 :(得分:4)

正如@carton所说,CADisplayLink用于与显示器同步。它不是通用计时器。它专门用于实时视频等情况,您希望以与同步刷新相关的方式进行更新。这显然不是你的问题。

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

如果您只想让进度表以0.25秒的增量上升,则只需递增进度指示器的值并返回。使用NSTimer调用它。 当它达到100%时,使计时器失效,使其停止。

您甚至不需要致电setNeedsDisplay。进度指标知道在价值变化时需要重新绘制。

答案 1 :(得分:2)

CADisplayLink与显示刷新率相关联,它(通常是?)以60Hz运行,即每秒60帧。您无法控制其触发的时间间隔,但可以选择设置frameInterval,允许您指定在显示链接通知之前必须经过的帧数。目标再次。"

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

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。你遇到了什么问题?