2016-08-19 62 views
2

我想滾動到位於UITextView的屬性文本中的特定子字符串。滾動完成後,我希望子字符串位於可見textview文本的頂部。但是,當textView.selectedRange位於子字符串的範圍之下時,我只能得到子字符串。我怎樣才能做到這一點,所以無論滾動範圍以前位於哪裏,子串總是出現在頂部?Textview的scrollRangeToVisible使範圍回到頂部

這是我當前的代碼

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

回答

4

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