标题非常自我解释,但我在CADisplayLink触发的循环中完成了一些动画。但是,只要我滚动了一个UIScrollView,我已添加到我的视图层次结构中,动画会立即停止,只有在滚动完全停止并再次停止时才会再次返回....
无论如何要取消这种行为?
答案 0 :(得分:29)
您还可以使用NSRunLoopCommonModes
代替NSDefaultRunLoopModes
来缓解此问题的影响:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
答案 1 :(得分:7)
使用UITrackingRunLoopMode
。它专为滚动内容而设计。
否则,只需调用render&目的地为-scrollViewDidScroll
。
UIScrollView broken and halts scrolling with OpenGL rendering (related CADisplayLink, NSRunLoop)
答案 2 :(得分:6)
使用另一个运行循环在另一个线程上运行显示链接(使用-addToRunLoop:forMode:
)。因此,创建一个新线程,在该线程上创建一个运行循环,并在该线程/运行循环上运行CADisplayLink。
答案 3 :(得分:4)
在这里,您可以找到更好(更复杂)的解决方案:
Animation in OpenGL ES view freezes when UIScrollView is dragged on iPhone
允许您使用'NSRunLoopCommonModes'并避免在不滚动手指时冻结OpenGL。
这与Doug发现的相关(将CADisplayLink的帧间隔设置为2而不是1修复UIScrollView)。
答案 4 :(得分:2)
NSRunLoopCommonModes似乎弄乱了uiscrollview的弹性和连续性。
答案 5 :(得分:2)
实际上CADisplayLink支持多个RunloopMode。 试试这个:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:UITrackingRunLoopMode];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
答案 6 :(得分:1)
我发现如果我将帧间隔设置为2而不是1(每秒30帧),一切正常。所以我正在做的是当我的弹出窗口出现时将其设置为2,并在它解除时将其重置为1.
答案 7 :(得分:1)
我们通过将frameInterval
从1更改为2来解决了同样的问题。这大大降低了OpenGL场景的渲染率,但它仍然可以充分满足您的需求。
frameInterval 显示前必须经过的帧数 链接再次通知目标。
@property(非原子)NSInteger frameInterval讨论默认值 值为1,这会导致您的应用程序被通知 刷新率。如果该值设置为更大的值 如果超过1,显示链接会以一小部分通知您的应用程序 本机刷新率。例如,将间隔设置为2会导致 显示链接每隔一帧触发一次,提供一半帧 率。
将此值设置为小于1会导致未定义的行为,并且是 程序员错误。