Установите UIView backgroundColor с помощью drawRect:

Я пытаюсь установить цвет фона пользовательского класса UIView. Класс также делает кварцевый рисунок в drawRect:метод.

Поскольку изменение цвета фона не происходит до следующей перерисовки вида, я изменяю UIView backgroundColor собственность перед звонком setNeedsDisplay, Я установил UIActivityIndicatorView анимировать, пока вид перерисовывается.

self.backgroundColor = theColor; 
[indicator startAnimating];
[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil];

Индикатор останавливается в конце setNeedsDisplay, theColor будет меняться каждый раз, когда мне нужно позвонить.

Допустим, у меня есть много времени setNeedsDisplay процесс. Я хотел бы установить фон и сохранить анимацию индикатора. В настоящее время меняется backgroundColor звонки setNeedsDisplay но даже не меняет backgroundColor, пока performSelectorInBackground метод работает! Поэтому мое приложение зависает, и ни один индикатор не анимируется. Как мне справиться с этой проблемой заказа? Благодарю.

Изменить: я имел в виду, что мой drawrect: может занять много времени.

2 ответа

Допустим, у меня есть трудоемкий процесс setNeedsDisplay

Давай не будем У вас нет переопределения бизнеса setNeedsDisplay, Я не совсем понимаю, чего вы в конечном итоге пытаетесь достичь, но весь этот вопрос, похоже, является неправильным пониманием того, как рисовать. Когда вы звоните setNeedsDisplay (что, как вам сказали, вы должны сделать в главном потоке), вот и все; Вы стоите в стороне, и когда наступает момент перерисовки, ваш взгляд drawRect: называется. Это рисунок.

Если проблема заключается в том, что индикатор активности никогда не срабатывает, то это потому, что вы никогда не даете ему шанс. Это также не собирается начинать идти до момента перерисовки. Но вы останавливаете индикатор активности еще до того, как наступит момент перерисовки! Очевидно, вы никогда не увидите

Способ визуально запустить индикатор активности перед следующим, что вы делаете, это выйти в основной поток после следующего момента перерисовки. Это называется "задержкой исполнения". Пример:

self.backgroundColor = theColor; 
[indicator startAnimating];
double delayInSeconds = 0.1;
dispatch_time_t popTime =
    dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    // do something further, e.g. call setNeedsDisplay
};

Вы можете расширить этот пример, позвонив dispatch_after еще раз, чтобы остановить индикатор после следующего момента перерисовки.

Однако я должен убедить вас, что если простое рисование занимает так много времени, что вам нужен индикатор активности, чтобы покрыть его, вы рисуете неправильно. Ваш акт рисования должен быть очень очень быстрым. Возможно, вы захотите посмотреть видео WWDC 2012 на эту тему; он дает отличные советы о том, как рисовать эффективно.

Вы можете обновить пользовательский интерфейс только в главном потоке, а не в фоновом режиме

Попробуйте использовать другое подпредставление с индикатором активности, вставьте перед перерисовкой и удалите из суперпредставления после

Другие вопросы по тегам