Что делает 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
? Обычно это говорит о том, что вид должен перерисовываться.