Textview scrollRangeToVisible сделать диапазон перейти наверх

Я пытаюсь прокрутить к определенной подстроке, расположенной в attribute Text UITextView. Когда прокрутка завершена, я хочу, чтобы подстрока находилась в верхней части видимого текста просмотра текста. Тем не менее, я могу заставить подстроку идти наверх только тогда, когда textView.selectedRange находится ниже диапазона подстроки. Как я могу сделать так, чтобы подстрока всегда появлялась сверху, независимо от того, где диапазон прокрутки был ранее расположен?

Это мой текущий код

   let text =  // a long NSAttributedString
   let substring = "put me at the top!"
   textView.attributedText = text

   func scrollToSubstring() {
      let str = text.string as NSString

      let range = str.rangeOfString(substring, options: .RegularExpressionSearch, range: NSMakeRange(0, str.length), locale: nil)

      textView.scrollRangeToVisible(range)
      // HOW CAN I MAKE IT SO range ALWAYS APPEARS AT THE TOP?
   }

1 ответ

Решение

UITextView это UIScrollView подкласс, так что если вы можете найти местоположение подстроки в координатах представления прокрутки (возможно с помощью TextKit), то вы можете установить contentOffset соответственно. Это работает для меня:

func scrollSubstringToTop() {
    let str = text.string as NSString

    let substringRange = str.rangeOfString(substring)
    let glyphRange = textView.layoutManager.glyphRangeForCharacterRange(substringRange, actualCharacterRange: nil)
    let rect = textView.layoutManager.boundingRectForGlyphRange(glyphRange, inTextContainer: textView.textContainer)
    let topTextInset = textView.textContainerInset.top
    let contentOffset = CGPoint(x: 0, y: topTextInset + rect.origin.y)

    textView.setContentOffset(contentOffset, animated: true)
}
Другие вопросы по тегам