2017-03-27 65 views
1

如何將UITextView中的段落分隔爲完全隔離的文本聚類,例如在進行選擇時只能選擇該段落中的單詞?如何在iOS應用程序中按段落分隔選擇(中等)?

在這種情況下,你只能選擇文本「你有義務。

enter image description here

I'm與選擇取消實驗時的段落外,做必要的數學定義段範圍,但到目前爲止沒有運氣。

+0

的這是一個非常廣泛的問題。 :( – Abizern

+0

@Abizern你會建議什麼?我不知道如何使它更具體:(我只是想在我的richTextEditor上的那種功能,我不知道從哪裏開始。 –

+1

問題,因爲我看看它,是你列出了一系列需求並尋求解決方案,更好的方法可能是將問題分解成更小的部分 – Abizern

回答

2

這個想法是當開始選擇文本時,從光標 位置找到當前段落的擴展名。然後僅允許該段落的範圍與對應於該選擇的範圍之間的交點 。


這是溶液作爲夫特3


class RichTextView: UITextView {...} 

extension RichTextView: UITextViewDelegate { 

    func textViewDidChangeSelection(_ textView: UITextView) { 
    let range = textView.selectedRange 
    if range.length > 0 { 
    if let maxRange = 
     textView.attributedText.getParagraphRangeContaining(cursorPosition: range.location){ 
      selectedRange = NSIntersectionRange(maxRange, range) 
     } 
    } 
    } 
} 

extension NSAttributedString { 

    func getParagraphRangeContaining(cursorPosition: Int) -> NSRange? { 
     let cursorPosition = cursorPosition - 1 

     let nsText = self.string as NSString 
     let textRange = NSMakeRange(0, nsText.length) 

     var resultRange : NSRange? 
     nsText.enumerateSubstrings(in: textRange, options: .byParagraphs, using: { 
      (substring, substringRange, _, _) in 

      if (NSLocationInRange(cursorPosition , substringRange)) { 
       resultRange = substringRange 
       return 
      } 
     }) 
     return resultRange 
    } 
} 
1

如果我正確理解你的問題,我會嘗試創建每個段落UITextView和正確定位他們。當用戶按下Enter鍵時(並確保在光標後面保留文本)時創建一個新的文本,並在兩個相鄰視圖的內容按下delete(光標位於第二個視圖的開頭)時創建一個新文本。

這樣一來,選擇將在每個視圖中工作,但用戶不能同時在兩個視圖中進行選擇。

+0

我一直在考慮這種可能性,但它似乎有點矯枉過正,我想這可能是一種更簡單的方法來實現它。 –

+0

如果您想用代碼支持您的想法,我會授予您賞金,以免它丟失。這將是偉大的 –

+0

現在我明白了,我認爲對於大多數情況來說,其他答案是更好的答案。這個答案會給你更多的定製,但是我想另一個更好。 – Coder256

相關問題