CADisplayLink перестает обновляться при прокрутке UIScrollView

Название довольно понятно, но у меня есть анимация, выполняемая в цикле, запущенном CADisplayLink. Однако, как только я прокручиваю UIScrollView, я добавил к своей иерархии представлений, анимация останавливается немедленно, только чтобы вернуться снова, когда прокрутка полностью остановилась и зашла в тупик....

В любом случае, чтобы отменить это поведение?

Ответ 1

Запустите ссылку на изображение (используя -addToRunLoop:forMode:) в другом потоке с другим циклом запуска. Поэтому создайте новый поток, создайте цикл цикла в этом потоке и запустите CADisplayLink в этом потоке/запуске.

Ответ 2

Вы также можете смягчить последствия этой проблемы, используя NSRunLoopCommonModes вместо NSDefaultRunLoopModes:

[displayLink addToRunLoop:[NSRunLoop currentRunLoop]
                  forMode:NSRunLoopCommonModes];

Ответ 4

Здесь вы можете найти лучшее (и более сложное) решение:

Анимация в OpenGL ES view зависает, когда UIScrollView перетаскивается на iPhone

который позволяет вам использовать "NSRunLoopCommonModes" и избегает замораживания OpenGL при удерживании пальца без прокрутки.

Это связано с тем, что нашел Дуг (установка интервала кадров CADisplayLink на 2 вместо 1 фиксации UIScrollView).

Ответ 5

NSRunLoopCommonModes, похоже, взволнован с непоколебимостью и непрерывностью характера uiscrollview.

Ответ 6

Фактически CADisplayLink поддерживает несколько RunloopMode. попробуйте следующее:

    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:UITrackingRunLoopMode];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

Ответ 7

Я обнаружил, что если я установил интервал кадра в 2 вместо 1 (так 30 кадров в секунду), все будет хорошо. Так что я делаю, это установить его на 2, когда мой popover появится и сбросить его до 1, когда он отклоняется.

Ответ 8

Мы исправили эту же проблему, изменив frameInterval с 1 на 2. Это существенно уменьшает скорость рендеринга вашей сцены OpenGL, но она все равно может отображать достаточно для ваших нужд.

frameInterval Количество кадров, которые должны пройти перед отображением ссылка снова уведомляет цель.

@property (nonatomic) NSInteger frameInterval Обсуждение Значение по умолчанию значение равно 1, что приводит к тому, что ваше приложение будет частота обновления дисплея. Если для значения установлено значение больше чем 1, отображаемая ссылка уведомляет ваше приложение на долю внутренняя частота обновления. Например, установка интервала в 2 причины отображающая связь для запуска каждого другого кадра, обеспечивая половину кадра Скорость.

Установка этого значения менее 1 приводит к поведению undefined и является ошибка программиста.