如何重构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
相关产品推荐
相关产品推荐

