Прокрутка UITextView вверх и вниз при вводе новой строки или символа
У меня есть UITextView. Он читает свою текстовую строку, анализирует уценку и отображает ее на экране, используяNSAttributedString
отAttributedString
.
Проблема
Когда текст короткий, все хорошо. Но когда текст превышает, может быть, 2 высоты экрана, он начинает прыгать вверх и вниз. Он прыгает вверх по новой строке, затем вниз по другой новой строке, затем вверх по 3-й новой строке, затем вниз по 4-й и повторяется.
Другая проблема заключается в том, что это портит мойdraw(in:rect)
метод в подклассе, который рисует прямоугольники серого фона для цитат и блоков кода. Рисунок основан на отдельных локациях персонажей. Так что я предполагаю, что расположение персонажей также перепуталось, когдаUITextView
пытается вычислить и разместить его .
Некоторые детали реализации
- парсинг делается в отдельном пакете.
- Я использовал проанализированные детали для создания новой атрибутивной строки.
- я реализовал
textViewDidChange(_ textView: UITextView)
так что он обновляет при вводе или удалении любых новых символов. - Потому что изменение
attributedText
так часто всегда будет приводить курсор ввода в конец textView, я отслеживаю местоположение курсора перед применением атрибутов, а затем возвращаю его в textView, чтобы textView мог оставаться там, где он был.
func textViewDidChange(_ textView: UITextView) {
let cursor = textView.selectedRange
// the problem will be gone if I comment out applyAttributes()
applyAttributes()
textView.selectedRange = cursor
textView.scrollRangeToVisible(cursor)
}
private func applyAttributes() {
// 1. get parsed tokens
// 2. construct attributedString using the tokens
// 3. give the token to textView.attributedText
// 4. draw textView's rect based on displayed attributedText
}
Когда я удаляю шаг 4, проблема сохраняется.
Проблема возникает как для программных, так и для аппаратных клавиатур
Также приветствуются любые советы о том, как я могу улучшить свой код, свою привычку и свою форму.
Заранее спасибо.