Ответ 1
Запустите ссылку на изображение (используя -addToRunLoop:forMode:
) в другом потоке с другим циклом запуска. Поэтому создайте новый поток, создайте цикл цикла в этом потоке и запустите CADisplayLink в этом потоке/запуске.
Название довольно понятно, но у меня есть анимация, выполняемая в цикле, запущенном CADisplayLink. Однако, как только я прокручиваю UIScrollView, я добавил к своей иерархии представлений, анимация останавливается немедленно, только чтобы вернуться снова, когда прокрутка полностью остановилась и зашла в тупик....
В любом случае, чтобы отменить это поведение?
Запустите ссылку на изображение (используя -addToRunLoop:forMode:
) в другом потоке с другим циклом запуска. Поэтому создайте новый поток, создайте цикл цикла в этом потоке и запустите CADisplayLink в этом потоке/запуске.
Вы также можете смягчить последствия этой проблемы, используя NSRunLoopCommonModes
вместо NSDefaultRunLoopModes
:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
Используйте UITrackingRunLoopMode
. Он специально предназначен для прокрутки.
В противном случае просто вызовите рендер и текущую процедуру в -scrollViewDidScroll
.
Здесь вы можете найти лучшее (и более сложное) решение:
Анимация в OpenGL ES view зависает, когда UIScrollView перетаскивается на iPhone
который позволяет вам использовать "NSRunLoopCommonModes" и избегает замораживания OpenGL при удерживании пальца без прокрутки.
Это связано с тем, что нашел Дуг (установка интервала кадров CADisplayLink на 2 вместо 1 фиксации UIScrollView).
NSRunLoopCommonModes, похоже, взволнован с непоколебимостью и непрерывностью характера uiscrollview.
Фактически CADisplayLink поддерживает несколько RunloopMode. попробуйте следующее:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:UITrackingRunLoopMode];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Я обнаружил, что если я установил интервал кадра в 2 вместо 1 (так 30 кадров в секунду), все будет хорошо. Так что я делаю, это установить его на 2, когда мой popover появится и сбросить его до 1, когда он отклоняется.
Мы исправили эту же проблему, изменив frameInterval
с 1 на 2. Это существенно уменьшает скорость рендеринга вашей сцены OpenGL, но она все равно может отображать достаточно для ваших нужд.
frameInterval Количество кадров, которые должны пройти перед отображением ссылка снова уведомляет цель.
@property (nonatomic) NSInteger frameInterval Обсуждение Значение по умолчанию значение равно 1, что приводит к тому, что ваше приложение будет частота обновления дисплея. Если для значения установлено значение больше чем 1, отображаемая ссылка уведомляет ваше приложение на долю внутренняя частота обновления. Например, установка интервала в 2 причины отображающая связь для запуска каждого другого кадра, обеспечивая половину кадра Скорость.
Установка этого значения менее 1 приводит к поведению undefined и является ошибка программиста.