如何在UITextView中获取光标位置及所在段落的文本范围
解决方案
核心思路
通过UITextView的选中文本位置、结合系统内置的段落范围枚举接口,可直接获取光标所在位置对应的完整段落范围,无需手动拆分换行符做判断。
具体实现步骤
- 第一步:获取当前光标的偏移位置
兼容光标未选中文本、以及用户选中部分文本的场景,统一取选中范围的起始位置即可:
// Objective-C 实现 UITextRange *selectedRange = [textView selectedTextRange]; // 计算光标相对于文本开头的偏移量 NSInteger cursorOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];
// Swift 实现 let selectedRange = textView.selectedTextRange let cursorOffset = textView.offset(from: textView.beginningOfDocument, to: selectedRange?.start ?? textView.beginningOfDocument)
- 第二步:根据光标偏移量获取对应段落的完整范围
调用NSString内置的paragraphRangeForRange:方法,自动匹配光标所在段落的起止范围,会自动跳过段落首尾的换行符:
NSRange paragraphRange = [textView.text paragraphRangeForRange:NSMakeRange(cursorOffset, 0)];
let paragraphRange = (textView.text as NSString).paragraphRange(for: NSRange(location: cursorOffset, length: 0))
- 第三步:对拿到的
paragraphRange应用你需要的文本属性即可
NSMutableAttributedString *attrStr = [textView.attributedText mutableCopy]; // 示例:给段落添加红色文字属性,可替换为你需要的任意TextAttributes [attrStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:paragraphRange]; textView.attributedText = attrStr;
let attrStr = NSMutableAttributedString(attributedString: textView.attributedText) // 示例:给段落添加红色文字属性,可替换为你需要的任意TextAttributes attrStr.addAttribute(.foregroundColor, value: UIColor.red, range: paragraphRange) textView.attributedText = attrStr
补充说明
- 上述方法自动适配
\n、\r、\r\n等多种系统识别的段落分隔符,不需要单独处理不同换行符的判断逻辑 - 如果用户选中了多段文本,可先判断选中范围的长度,如果大于0可以选择仅处理选中文本、或者遍历选中范围内的所有段落分别处理
内容的提问来源于stack exchange,提问作者NewUser
相关产品推荐
相关产品推荐

