CADisplayLink stops updating when UIScrollView scrolled

后端 未结 8 1302
星月不相逢
星月不相逢 2020-12-05 15:17

Title is quite self explanatory, but I have some animation being done in a loop triggered by CADisplayLink. However, as soon as I scroll a UIScrollView I have added to my vi

相关标签:
8条回答
  • 2020-12-05 15:31

    We fixed this same issue by changing the frameInterval from 1, to 2. This essentially halves the rendering rate of your OpenGL scene, but it still may render sufficiently for your needs.

    frameInterval The number of frames that must pass before the display link notifies the target again.

    @property(nonatomic) NSInteger frameInterval Discussion The default value is 1, which results in your application being notified at the refresh rate of the display. If the value is set to a value larger than 1, the display link notifies your application at a fraction of the native refresh rate. For example, setting the interval to 2 causes the display link to fire every other frame, providing half the frame rate.

    Setting this value to less than 1 results in undefined behavior and is a programmer error.

    0 讨论(0)
  • 2020-12-05 15:33

    Here you can find a better (and more complex) solution:

    Animation in OpenGL ES view freezes when UIScrollView is dragged on iPhone

    that allows you to use 'NSRunLoopCommonModes' and avoids OpenGL freezing when holding a finger without scrolling.

    This is related to what Doug found (setting the frame interval of CADisplayLink to 2 instead of 1 fixing UIScrollView).

    0 讨论(0)
  • 2020-12-05 15:34

    Use UITrackingRunLoopMode. It's specifically designed for scrolling stuffs.

    Otherwise, just call render & present routine at -scrollViewDidScroll.

    UIScrollView broken and halts scrolling with OpenGL rendering (related CADisplayLink, NSRunLoop)

    0 讨论(0)
  • 2020-12-05 15:36

    Actually CADisplayLink support multiple RunloopMode. try this:

        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:UITrackingRunLoopMode];
        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
    0 讨论(0)
  • 2020-12-05 15:39

    You can also mitigate the effects of this issue by using NSRunLoopCommonModes instead of NSDefaultRunLoopModes:

    [displayLink addToRunLoop:[NSRunLoop currentRunLoop]
                      forMode:NSRunLoopCommonModes];
    
    0 讨论(0)
  • 2020-12-05 15:45

    NSRunLoopCommonModes seems to mess with the bounciness and continuous nature of the uiscrollview.

    0 讨论(0)
提交回复
热议问题