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

如何重构UITextView的visibleRange方法解决Text Kit 2回退至Text Kit 1问题?

解决Text Kit 2下访问NSLayoutManager的警告问题

当UITextView启用Text Kit 2后,原代码因调用Text Kit 1的NSLayoutManager相关API触发编译器警告,需重构获取可见文本范围的方法,适配Text Kit 2的API体系。

重构后的代码

- (NSRange)visibleRange {
    // 获取Text Kit 2对应的布局管理器
    NSTextLayoutManager *layoutManager = self.scriptView.textLayoutManager;
    if (!layoutManager) {
        return NSMakeRange(0, 0);
    }
    
    // 获取文本视图的可见区域
    CGRect visibleRect = self.scriptView.bounds;
    
    // 将可见区域转换为Text Kit 2的文本范围对象
    NSTextRange *textRange = [layoutManager textRangeForBoundingRect:visibleRect
                                                      inTextContainer:self.scriptView.textContainer];
    if (!textRange) {
        return NSMakeRange(0, 0);
    }
    
    // 将NSTextRange转换为NSRange格式返回
    return [layoutManager NSRangeForTextRange:textRange actualNSRange:NULL];
}

关键改动说明

  • 替换Text Kit 1的NSLayoutManager为Text Kit 2的NSTextLayoutManager,通过UITextView的textLayoutManager属性获取
  • 使用textRangeForBoundingRect:inTextContainer:直接将可见区域转为文本范围,无需先处理字形范围,更贴合Text Kit 2的设计逻辑
  • 通过NSRangeForTextRange:actualNSRange:完成Text Kit 2的NSTextRange到传统NSRange的转换,保持返回值格式兼容原有调用逻辑

内容的提问来源于stack exchange,提问作者Zac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:41:03