我在我的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];
有没有办法放慢速度以获得我想要的结果?
答案 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
。你遇到了什么问题?