如何使用 Text Kit 查找单行文本的高度

Posted

技术标签:

【中文标题】如何使用 Text Kit 查找单行文本的高度【英文标题】:How to to find the height of a single line of text using Text Kit 【发布时间】:2016-01-29 04:20:12 【问题描述】:

我正在尝试使用 Text Kit 查找单行文本的高度。 Calculating Text Height documentation 说

注意:您无需使用此技术来查找单行文本的高度。 NSLayoutManager 方法 defaultLineHeightForFont: 返回该值。默认行 高度是字体最高上升线的总和,加上绝对 其最深下降的值,加上其前导。

但是,当我检查 NSLayoutManager Class Reference(并且还在 Xcode 中进行测试)时,我没有看到 defaultLineHeightForFont: 方法。这是为什么?有其他选择吗?

注意事项:

我不想set the line height。 ways to do this 显然不使用 Text Kit。但是,由于我已经设置了 Text Kit 堆栈并且文档似乎表明这是可能的,所以我想使用 Text Kit。 我更喜欢 Swift 答案,但 Objective-C 也可以。

更新

直到我阅读了@JoshCaswell 的评论,我才意识到我链接到的文档是针对 OS X 的。我正在专门寻找如何在 ios 中执行此操作。

【问题讨论】:

您链接到 OS X 编程指南、NSLayoutManager 参考的 tvOS 副本,并用 iOS 标记了问题。你能澄清一下你的目标平台吗?在 OS X 上,NSLayoutManager does indeed have -defaultLineHeightForFont: 啊,我错过了。我的目标是 iOS,而不是 OS X。 真的讨厌 Apple 最新的文档搜索网络界面。以这种方式混淆自己是非常容易的,当你在寻找 OS X 时,点击 tvOS 文档(并且简单类名的关键字结果很糟糕)。 【参考方案1】:

在 TextKit 中,您可以使用布局管理器来获取行高 - lineFragmentRectForGlyphAtIndex:effectiveRange:。正如您从这个函数的名称中注意到的那样,它被命名为“线片段”。为什么?因为您的布局并不总是有完整的行,而是您可能有一个排除路径(包含形状或图像),其中文本环绕在它周围。在这种情况下,您有部分行(行片段)用于布置文本。

在布局管理器的委托中,您将实现如下所示的函数:

-(void)layoutManager:(NSLayoutManager *)layoutManager didCompleteLayoutForTextContainer:(NSTextContainer *)textContainer atEnd:(BOOL)layoutFinishedFlag
//This is only for first Glyph
CGRect lineFragmentRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:0 effectiveRange:nil];
// The height of this rect is the line height.

【讨论】:

以上是关于如何使用 Text Kit 查找单行文本的高度的主要内容,如果未能解决你的问题,请参考以下文章

如何在Swift中运用Text Kit框架

textbox根据内容自动调整高度

如何设置块级元素的单行文本垂直居中

根据里面的多行文本视图动态设置 ListView 高度

如何获得文本的真实高度?

css处理单行,多行文本溢出