当UIScrollView滚动时,CADisplayLink会停止更新

时间:2010-03-26 15:20:09

标签: iphone objective-c cocoa-touch core-animation

标题非常自我解释,但我在CADisplayLink触发的循环中完成了一些动画。但是,只要我滚动了一个UIScrollView,我已添加到我的视图层次结构中,动画会立即停止,只有在滚动完全停止并再次停止时才会再次返回....

无论如何要取消这种行为?

8 个答案:

答案 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会导致未定义的行为,并且是   程序员错误。