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

Ios 在任何UI滚动操作期间,应用程序停止接收NSTimer选择器回调,ios,animation,scroll,nstimer,cadisplaylink,Ios,Animation,Scroll,Nstimer,Cadisplaylink,我在主窗口上有一个OpenGL动画绘图,由NSTimer启动。如果我打开一个带有可滚动UITableView菜单的弹出窗口,动画在滚动过程中冻结。一旦滚动动画停止,计时器回调将再次开始。只有当用户主动尝试滚动时,主窗口才会停止更新 苹果的滚动动画似乎在某种程度上阻碍了主循环的调度。这是真的吗?有办法解决吗 如果我能帮助的话,我真的不想引入多线程,因为这会成倍地增加代码的复杂性 此外,我还尝试使用CADisplayLink而不是NSTimer,显示链接调用也被滚动动画阻止。正如bdesham回答的

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

苹果的滚动动画似乎在某种程度上阻碍了主循环的调度。这是真的吗?有办法解决吗

如果我能帮助的话,我真的不想引入多线程,因为这会成倍地增加代码的复杂性


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

正如bdesham回答的那样,“苹果的首要任务是UI响应,因此在这种情况下,UI操作将阻止代码的其他部分。你需要将计时器移动到另一个线程。”

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

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

苹果公司的首要任务是用户界面的响应性,因此在这种情况下,用户界面操作将阻止代码的其他部分。您需要将计时器移动到另一个线程。是否必须使用计时器制作动画?为什么不使用UIView animateWithDuration?它用于OpenGL绘图的动画,而不是视图的动画。UI是线程#1,永远不应该被阻止。在回答您的问题之前,您必须决定线程1上应该显示什么:动画还是滚动。您必须将其中一个线程移动到另一个线程。但是先决定,我们可以帮忙。