Textview scrollRangeToVisible 使范围到顶部
Textview scrollRangeToVisible make range go to top
我正在尝试滚动到位于 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?
}
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)
}
我正在尝试滚动到位于 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?
}
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)
}