2013-03-13 2 views
0

У меня есть анимационный рисунок OpenGL в главном окне, запущенном NSTimer. Если я открою окно popover с прокручиваемым меню UITableView, анимация замерзает во время прокрутки. Как только анимация прокрутки прекратится, обратные вызовы таймера начнут снова. Его только тогда, когда пользователь активно пытается прокрутить, что основное окно перестает обновляться.Приложение перестает получать обратные вызовы выбора NSTimer во время любой операции прокрутки UI

Кажется, что анимация прокрутки Apple каким-то образом блокирует отправку на основной цикл. Это правда, и есть ли способ исправить это?

Я действительно не хочу вводить многопоточность, если могу помочь, потому что это будет экспоненциально увеличивать сложность моего кода.

Также я попытался использовать CADisplayLink вместо NSTimer, а вызовы на экранной линии также блокируются анимацией прокрутки.

+4

Приоритет Apple №1 - отзывчивость пользовательского интерфейса, поэтому в подобных ситуациях действия пользовательского интерфейса блокируют другие части вашего кода. Вам нужно переместить свой таймер в другой поток. – bdesham

+0

Вам нужно сделать анимацию с помощью таймера? Почему бы не использовать UIView animateWithDuration? –

+0

Его для анимации рисунка OpenGL, а не вида. – Robotbugs

ответ

0

Как ответил bdesham, «приоритет Apple №1 - отзывчивость пользовательского интерфейса, поэтому в таких ситуациях пользовательские интерфейсы блокируют другие части вашего кода. Вам нужно переместить свой таймер в другой поток».

0

NSTimer привязан к циклу запуска и режиму. Во время отслеживания событий режим UITrackingRunLoopMode. По умолчанию таймеры, созданные scheduledTimerWithTimeInterval, добавляются с NSDefaultRunLoopMode и поэтому не срабатывают при отслеживании.

[[NSRunLoop currentRunLoop] addTimer:yourTimer forMode:UITrackingRunLoopMode];