如何使用TextKit 2获取UITextView的行数?
iOS 16+ 基于TextKit 2计算UITextView行数的实现
自iOS 16开始,UITextView底层的TextKit 1被TextKit 2取代,原有的layoutManager被标记为弃用,取而代之的是textLayoutManager。但TextKit 2并未完全保留旧版本的API,因此需要重新实现行数计算逻辑。
以下是兼容TextKit 1和TextKit 2的完整扩展代码:
extension UITextView { var numberOfLines: Int { if #available(iOS 16.0, *) { // TextKit 2 实现 // 遍历所有文本布局的行片段并计数 let totalLines = textLayoutManager.textLayouts.flatMap { $0.lineFragments }.count // 空文本时默认返回1行 return max(1, totalLines) } else { // TextKit 1 原有实现 let layout = layoutManager var lines = 0 var index = 0 var lineRange = NSRange() while index < layout.numberOfGlyphs { layout.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange) index = NSMaxRange(lineRange) lines += 1 } return max(1, lines) } } }
说明
- TextKit 2中,
textLayoutManager管理着所有的文本布局(textLayouts),每个布局包含多个lineFragments(行片段),通过遍历所有布局的行片段即可统计总行数。 - 无论新旧版本,都通过
max(1, ...)保证空文本的UITextView返回至少1行,符合系统默认表现。
内容的提问来源于stack exchange,提问作者lurning too koad
相关产品推荐
相关产品推荐

