应用程序在任何UI滚动操作期间停止接收NSTimer选择器回调

时间:2013-03-13 22:57:39

标签: ios animation scroll nstimer cadisplaylink

我在NSTimer触发的主窗口上绘制了一个OpenGL动画。如果我打开一个带有可滚动UITableView菜单的弹出窗口,动画会在滚动过程中冻结。滚动动画停止后,计时器回调再次开始。只有当用户主动尝试滚动时,主窗口才会停止更新。

似乎Apple的滚动动画以某种方式阻止主循环上的调度。这是真的,有没有办法解决它?

如果我可以帮助它,我真的不想引入多线程,因为这会以指数方式增加我的代码的复杂性。

此外,我尝试使用CADisplayLink而不是NSTimer,滚动动画也阻止了显示链接调用。

2 个答案:

答案 0 :(得分:0)

正如bdesham所说,“Apple的首要任务是UI响应,因此在这种情况下,UI操作会阻止代码的其他部分。您需要将计时器移动到另一个线程。”

答案 1 :(得分:0)

NSTimer与运行循环和模式相关联。在事件跟踪期间,模式为UITrackingRunLoopMode。默认情况下,scheduledTimerWithTimeInterval创建的计时器会添加NSDefaultRunLoopMode,因此在跟踪期间不会触发。

[[NSRunLoop currentRunLoop] addTimer:yourTimer forMode:UITrackingRunLoopMode];