如何将UITextView
内的段落分隔成完全隔离的文本群集,例如在进行选择时,您只能选择该段落中的单词?
在这种情况下,您只能选择文字“您有义务。”
我在段落之外尝试取消选择,执行必要的数学定义段落范围,但到目前为止没有运气。
答案 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并将光标定位在第二个视图的开头,则加入两个相邻视图的内容。
这样,选择在每个视图中都有效,但用户无法一次选择两个视图。