Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios text查看滚动范围可见使范围变为顶部_Ios_Swift_Textview_Scrollview_Nsrange - Fatal编程技术网

Ios text查看滚动范围可见使范围变为顶部

Ios text查看滚动范围可见使范围变为顶部,ios,swift,textview,scrollview,nsrange,Ios,Swift,Textview,Scrollview,Nsrange,我试图滚动到UITextView的attributedText中的特定子字符串。滚动完成后,我希望子字符串位于可见textview文本的顶部。但是,只有当textView.selectedRange位于子字符串的范围之下时,我才能使子字符串转到顶部。如何使子字符串始终显示在顶部,无论滚动范围以前位于何处 这是我当前的代码 let text = // a long NSAttributedString let substring = "put me at the top!" t

我试图滚动到UITextView的attributedText中的特定子字符串。滚动完成后,我希望子字符串位于可见textview文本的顶部。但是,只有当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)
}