2016-08-19 8 views
2

UITextViewのattributedTextにある特定の部分文字列にスクロールしようとしています。スクロールが完了したら、部分文字列を表示可能なtextviewテキストのTOPに配置します。しかし、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

UITextViewあなたは、スクロールビューの座標(TextKitを使用可能)で、サブストリングの位置を見つけることができますので、もし、あなたがそれに応じてcontentOffsetを設定することができ、UIScrollViewサブクラスです。これは私のために働いています:

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) 
} 
関連する問題