Здесь код не нужен. Мне нужно некоторое руководство о том, как расположить все глифы очень длинной многострочной строки для отображения в UITextView с включенной прокруткой. Немного справочной информации для понимания обстоятельств.
Предыстория: у меня есть очень длинный многострочный текст, который необходимо представить в UITextView с включенной прокруткой. Я создал функцию, которая идентифицирует CGRect
позицию совпадения строки поиска в многострочной строке, а затем переводит пользователя в CGRect
позицию совпадения. Это достигается путем передачи CGRect
совпадающего текста в contentOffset
, который анимирует прокрутку до нужного места. CGRect
, передаваемое в contentOffset
, генерируется с использованием layoutmanager
для обеспечения точности. Другими словами, CGRect
текста основано на позиции глифа совпадающей строки.
Однако, если CGRect
совпадающей строки поиска расположено вертикально далеко от UITextView bounds.height
, анимация фактически не работает. Никакой прокрутки нет. Как будто анимация прокрутки не знает, где найти позицию CGRect
для прокрутки до соответствующей строки. Я могу исправить проблему, если сначала вручную прокручу до самого низа UITextView, а затем выполню анимацию до позиции CGRect
совпадающей строки поиска. При таких обстоятельствах создается впечатление, что UITextView имеет полное представление о макете текста и может точно найти расположение CGRect
совпадающей строки поиска в многострочной строке.
Исходя из вышеизложенного, для меня очевидно, что UITextView не размещает сразу все глифы многострочной строки. Представление, вероятно, рисует глифы порциями, подобно тому, как табличное представление создает ячейки. Мне также кажется, что UITextView имеет возможность сохранять всю информацию о макете глифа, когда я вручную прокручиваю границы представления до самого низа вертикального размера содержимого.
Есть ли доступный код, который эффективно отображает весь размер содержимого UITextView, даже если глифы находятся далеко за пределами вертикальных границ UITextView? Похоже, мне нужно сначала расположить все глифы, чтобы предотвратить ошибку, описанную выше.
scrollRangeToVisible
UITextView
? - person rob mayoff   schedule 11.04.2019contentSize
достаточно велико, чтобы вместить вашеCGRect
, прежде чем пытаться прокрутить? Возможно,contentSize
не обновляется должным образом, если вы запускаете дополнительный добавочный макет вне контроля текстового представления. - person rob mayoff   schedule 11.04.2019contenSize
, я получаю полный размер до запуска анимации. Должен быть какой-то объект, который можно обновить, чтобы предоставить необходимую информацию о макете. Как scrollRangeToVisible выполняет эту задачу? - person KDiaz   schedule 11.04.2019.ensureLayout(..)
и/илиensureGlyphs(...)
? - person DonMag   schedule 12.04.2019let matchTxtRect = textView.layoutManager.boundingRect(forGlyphRange: matchRange, in: textView.textContainer)
, гдеtextView
— это объект UITextView, аmatchRange
— это значение NSRange, но только один элемент массива совпадающих диапазонов, найденных в многострочной строке. - person KDiaz   schedule 12.04.2019let matchTxtRect = textView.layoutManager.boundingRect(...)
попробуйте позвонитьtextView.layoutManager.ensureLayout(for: textView.textContainer)
--- если это не поможет, посмотрите другие доступные функции ensure: developer.apple.com/documentation/uikit/nslayoutmanager/ - person DonMag   schedule 12.04.2019.ensureLayout
вviewDidLayoutSubviews
, который отлично работает. Медленно, но верно я начинаю лучше понимать объекты UIKit. -Кит - person KDiaz   schedule 15.04.2019