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)
}