2017-03-27 25 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

相关问题