如何在iOS应用程序中按段落(像媒体一样)打破选择?

时间:2017-03-27 09:07:45

标签: ios objective-c swift uitextview nsattributedstring

如何将UITextView内的段落分隔成完全隔离的文本群集,例如在进行选择时,您只能选择该段落中的单词?

在这种情况下,您只能选择文字“您有义务。

enter image description here

我在段落之外尝试取消选择,执行必要的数学定义段落范围,但到目前为止没有运气。

2 个答案:

答案 0 :(得分:2)

  

这个想法是从光标定位当前段落的扩展名   开始选择文本时的位置。然后只允许   段落范围与选择对应范围之间的交集。

这是Swift 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 :(得分:1)

如果我正确理解了您的问题,我会尝试为每个段落创建一个UITextView并正确定位它们。当用户按下enter键时创建一个新的(并确保在光标后保留文本),如果他们按下delete并将光标定位在第二个视图的开头,则加入两个相邻视图的内容。

这样,选择在每个视图中都有效,但用户无法一次选择两个视图。