Что делает UITextView после установки attributeText?

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

Я использую firstRectForRange метод (из UITextInput) в UITextView. Этот метод возвращает рамку указанного текстового диапазона в textView.

Тем не менее, он не работает правильно сразу после установки attributeText. Требуется минимальное количество времени, прежде чем он вернет ожидаемое значение. Скорее всего, этот период может быть временем, в течение которого первый кадр с обновленным текстом отображается и отображается на экране.

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

Что делает UITextView между установкой attributedString и отображением следующего кадра на экране? Есть ли лучший способ / вызов метода для меня, чтобы подключиться?
Есть ли способ заставить меня выполнить это действие синхронно?

Вещи, которые я пытался назвать:
(после установки attribuText; перед вызовом firstRectForRange)

  • призвание setNeedsLayout а также layoutIfNeeded до firstRectForRange,
  • призвание drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)

1 ответ

Вы пытаетесь установить attributeText из фонового потока? Я предполагаю, что это проблема. Все изменения интерфейса должны происходить в основном потоке. Исходя из личного опыта, изменение вещей из фонового потока иногда работает, часто медленнее и даже чаще вообще не работает.

Если это так, то dispatch_async это именно то, что вы хотите сделать. Это позволяет очень легко обрабатывать данные в фоновом режиме, а затем быстро переходить к основному потоку для рендеринга. Если вы хотите сделать больше обработки после установки строки и поиска firstRectForRange Вы могли бы использовать dispatch_sync заставить ваш фоновый поток ждать рендеринга или отправить обратно в другой поток после рендеринга.

Что касается того, что делает UITextView при рендеринге attribuStString, я действительно не уверен, но я предполагаю, что небольшая задержка происходит из-за того, что система выясняет, как должна выглядеть приписанная строка и как она будет отображаться. Для дальнейшего понимания вам, вероятно, нужно углубиться в CoreText, поскольку под капотом происходит довольно много.

редактировать: если вы находитесь в главной теме, то я не думаю, что вы можете сделать намного больше. С помощью dispatch_after может быть немного чище, чем при использовании dispatch_async.

Еще одна мысль. Вы пробовали звонить setNeedsDisplay? Обычно это говорит о том, что вид должен перерисовываться.

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