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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:30:01