Прокрутка UITextView вверх и вниз при вводе новой строки или символа

У меня есть UITextView. Он читает свою текстовую строку, анализирует уценку и отображает ее на экране, используяNSAttributedStringотAttributedString.

Проблема

Когда текст короткий, все хорошо. Но когда текст превышает, может быть, 2 высоты экрана, он начинает прыгать вверх и вниз. Он прыгает вверх по новой строке, затем вниз по другой новой строке, затем вверх по 3-й новой строке, затем вниз по 4-й и повторяется.

Другая проблема заключается в том, что это портит мойdraw(in:rect)метод в подклассе, который рисует прямоугольники серого фона для цитат и блоков кода. Рисунок основан на отдельных локациях персонажей. Так что я предполагаю, что расположение персонажей также перепуталось, когдаUITextViewпытается вычислить и разместить его .

Некоторые детали реализации

  1. парсинг делается в отдельном пакете.
  2. Я использовал проанализированные детали для создания новой атрибутивной строки.
  3. я реализовалtextViewDidChange(_ textView: UITextView)так что он обновляет при вводе или удалении любых новых символов.
  4. Потому что изменение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, проблема сохраняется.

Проблема возникает как для программных, так и для аппаратных клавиатур

Также приветствуются любые советы о том, как я могу улучшить свой код, свою привычку и свою форму.

Заранее спасибо.

0 ответов

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