Мои пользовательские элементы пользовательского интерфейса не обновляются во время прокрутки UIScrollView - PullRequest
17 голосов
/ 05 ноября 2010

У меня есть элемент пользовательского интерфейса с вращающимся кругом, который обновляется с помощью NSTimer. У меня также есть UIScrollView, который блокирует вращающийся круг во время прокрутки. Это ожидалось, потому что таймер и представление прокрутки, где оба в одном потоке.

Так что я поместил таймер в отдельную ветку, которая в принципе прекрасно работает! Я вижу, как это работает, потому что NSLogs продолжают появляться даже во время прокрутки.

Но моя проблема в том, что мой вращающийся круг все еще останавливается на прокрутке! Я подозреваю, что перерисовка остановлена ​​до следующей итерации цикла выполнения основного потока (?). Таким образом, даже если его угол постоянно меняется, он не может быть перерисован ...

Есть идеи, что я могу сделать? Спасибо!

Ответы [ 3 ]

42 голосов
/ 09 ноября 2010

Во время прокрутки цикл выполнения основного потока находится в UITrackingRunLoopMode . Поэтому вам нужно запланировать таймер в этом режиме (возможно, в дополнение к режиму по умолчанию). Я считаю, что NSRunLoopCommonModes включает в себя режимы по умолчанию и режимы отслеживания событий, так что вы можете просто сделать это:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.42 target:foo selector:@selector(doSomething) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Кстати, вы должны делать все это в главном потоке. Нет необходимости порождать фоновый поток (если каждый вызов таймера не будет выполнять длительную обработку).

3 голосов
/ 09 ноября 2010

UIScrollView не просто блокирует NSTimers, он блокирует весь основной поток.И к объектам UIKit следует обращаться только в основном потоке (и, зачастую, они непредсказуемо ограничены, если вы пытаетесь обойти это ограничение), поэтому, вероятно, даже если у вас есть часы, поступающие из внешнего потока,Вы не можете публиковать обновления.

Это немного уловка, но есть ли способ добиться анимации с помощью CoreAnimation?Вещи, связанные с этим, продолжают работать независимо от того, что происходит в главном потоке.

0 голосов
/ 09 ноября 2010

Вы правы в том, что UIScrollView не обновляет свой вид контента во время прокрутки.

Вероятно, ваша лучшая ставка - и это что-то вроде хака - должна отображать ваш анимационный вид отдельно (возможно, в пределахракурс, чтобы получить свободное отсечение) и использовать функции обратного вызова делегата с прокруткой, чтобы узнать текущую позицию прокрутки и соответственно расположить анимацию.

ПРИМЕЧАНИЕ : это предложениеэто взломать !Это не лучшие практики, и это, безусловно, противоречит простому, поддерживаемому коду без побочных эффектов.Тем не менее, я могу думать только о том, чтобы получить нужный вам дисплей.

Еще один прием: еще раз подумайте о важности отображения анимированного содержимого в режиме прокрутки во время прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...