Как заставить расположение глифов, расположенных далеко за пределами вертикальных границ UITextView? - PullRequest
0 голосов
/ 11 апреля 2019

Код здесь не требуется.Мне нужно несколько советов о том, как расположить все глифы очень длинной многострочной строки для отображения в UITextView с включенной прокруткой.Некоторая справочная информация, чтобы понять обстоятельства.

Справочная информация: у меня очень длинный многострочный текст, который должен быть представлен в UITextView с включенной прокруткой.Я создал функцию, которая идентифицирует позицию CGRect соответствия строки поиска в многострочной строке, а затем анимирует пользователя в позицию CGRect соответствия.Это достигается путем передачи CGRect сопоставленного текста в contentOffset, который оживляет прокрутку к месту.CGRect, переданный в contentOffset, генерируется с использованием layoutmanager для обеспечения точности.Другими словами, CGRect текста основывается на положении глифа совпадающей строки.

Однако, если CGRect соответствующей строки поиска расположен вертикально далеко от UITextView bounds.height, анимация фактически завершается неудачей.Там нет прокрутки вообще.Это как если бы анимация прокрутки не знала, где найти позицию CGRect для прокрутки до соответствующей строки.Я могу исправить проблему, если сначала вручную прокрутить до самого низа UITextView, а затем выполнить анимацию до позиции CGRect соответствующей строки поиска.При таких обстоятельствах создается впечатление, что UITextView имеет полное представление о текстовой разметке и может точно найти местоположение совпадающей строки поиска CGRect в многострочной строке.

Исходя из вышеизложенного, для меня очевидно, что UITextView не размещает все глифы многострочной строки одновременно.Скорее всего, представление отображает глифы фрагментами, подобно тому, как представление таблицы создает ячейки.Мне также кажется, что UITextView имеет возможность сохранять всю информацию о макете глифа, когда я вручную прокручиваю границы представления до самого низа вертикального размера контента.

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

1 Ответ

1 голос
/ 15 апреля 2019

По соображениям производительности весь макет содержимого UITextView не обязательно определяется, когда вы ожидаете, что он будет.

Например, если у вас достаточно текста в текстовом представлении, чтобы охватить видимую область в 10 раз, UIKit может «задержаться» при размещении текста. В конце концов, тот факт, что текст есть, вовсе не означает, что пользователь когда-либо перейдет к нему.

NSLayoutManager предоставляет несколько функций, которые позволяют вам обеспечить полное содержание вашего текстового представления, когда вы хотите получить к нему доступ (см. https://developer.apple.com/documentation/uikit/nslayoutmanager):

func ensureGlyphs(forCharacterRange: NSRange)
func ensureGlyphs(forGlyphRange: NSRange)
func ensureLayout(forBoundingRect: CGRect, in: NSTextContainer)
func ensureLayout(forCharacterRange: NSRange)
func ensureLayout(forGlyphRange: NSRange)
func ensureLayout(for: NSTextContainer)

Согласно комментариям ОП, вызов .ensureLayout в viewDidLayoutSubviews() решил проблему.

...