我在NSTimer触发的主窗口上绘制了一个OpenGL动画。如果我打开一个带有可滚动UITableView菜单的弹出窗口,动画会在滚动过程中冻结。滚动动画停止后,计时器回调再次开始。只有当用户主动尝试滚动时,主窗口才会停止更新。
似乎Apple的滚动动画以某种方式阻止主循环上的调度。这是真的,有没有办法解决它?
如果我可以帮助它,我真的不想引入多线程,因为这会以指数方式增加我的代码的复杂性。
此外,我尝试使用CADisplayLink而不是NSTimer,滚动动画也阻止了显示链接调用。
答案 0 :(得分:0)
正如bdesham所说,“Apple的首要任务是UI响应,因此在这种情况下,UI操作会阻止代码的其他部分。您需要将计时器移动到另一个线程。”
答案 1 :(得分:0)
NSTimer与运行循环和模式相关联。在事件跟踪期间,模式为UITrackingRunLoopMode
。默认情况下,scheduledTimerWithTimeInterval
创建的计时器会添加NSDefaultRunLoopMode
,因此在跟踪期间不会触发。
[[NSRunLoop currentRunLoop] addTimer:yourTimer forMode:UITrackingRunLoopMode];