如何使用 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 查找单行文本的高度的主要内容,如果未能解决你的问题,请参考以下文章