You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:54:01