文本视图的scrollRangeToVisible方法如何使范围回到顶部

3
我正在尝试滚动到UITextView的attributedText中特定子字符串的位置。当滚动完成后,我希望该子字符串位于可见文本视图文本的顶部。然而,当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个回答

5

UITextViewUIScrollView 的子类,因此如果您可以在滚动视图的坐标中找到子字符串的位置(可能使用 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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接