2016-08-19 5 views
2

UITextView의 attributedText에있는 특정 하위 문자열로 스크롤하려고합니다. 스크롤이 완료되면 부분 문자열이 보이는 텍스트 뷰 텍스트의 TOP에 위치하게됩니다. 그러나 textView.selectedRange가 부분 문자열의 범위 아래에있을 때만 부분 문자열을 맨 위로 가져올 수 있습니다. 스크롤 범위가 이전에 있던 위치에 상관없이 하위 문자열이 항상 맨 위에 표시되도록하려면 어떻게해야합니까?Textview scrollRangeToVisible 범위 만들기 맨 위로 이동

이것은 당신이 (TextKit을 사용 가능) 스크롤 뷰의 좌표에있는 문자열의 위치를 ​​찾을 수 있습니다 다음 그에 따라 contentOffset을 설정할 수 있습니다, 그래서 만약

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가하는 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) 
}