ios - 如何测量渲染字符串的实际高度?

标签 ios cocoa-touch

我正在尝试测量要绘制的字符串。我尝试过 sizeWithAttributes:,但这对不同字符没有区别:

NSLog(@"A: %@", NSStringFromCGSize([@"." sizeWithAttributes:labelAttributes]));
NSLog(@"B: %@", NSStringFromCGSize([@"X" sizeWithAttributes:labelAttributes]));
A: {6, 23}
B: {12, 23}

请注意,两个字符的报告高度相同。是否有一个调用可以尊重 .X 之间的高度差?

最佳答案

不存在“真实高度”这样的东西。字体规范是一个复杂的主题。

字符串(由字符组成)被转换为一堆字形。这些字形定义了可见(渲染)的内容。这个过程涉及无尽的微妙之处,可能会改变您对“真实高度”的定义。

示例:

  • 某些字符非常超出正常行高。
  • 某些(图形)渲染选项超出了所有字形的边界框(例如阴影或轮廓)。
  • 字体规范包含无数不同的值,这些值可被视为字符(或字形)的边界框。

Zapfino Glyphs

此图像显示使用 Zapfino 字体(在 Mac 上的 TextEdit.app 中)呈现的字符串 “abc f 123”。 f 字符被选中(绿色框)。视觉特征远远超出了选择范围所考虑的边界框。

红色文本应用了阴影。计算这部分文本的边界框也不容易。

您的情况听起来像是您认为 "." 字符的大小比 "X" 更小。但是空格字符的大小是否为零呢?在不准确了解用例的情况下,很难定义“实际大小”。即使如此,通常也会出现许多未定义的边缘情况。

我有一个用例,我想将字符串转换为 PNG 图像(我知道这很愚蠢)。在这种情况下,最好的选择是将字符串渲染到一个大的位图上下文中,然后从外向内搜索原始数据位平面,直到找到第一个非透明像素。

关于ios - 如何测量渲染字符串的实际高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25323983/

相关文章:

ios - 如何以编程方式删除 iOS 中的多个通讯录联系人?

php - 使用 laravel 内置的 API 登录用户

ios - 从 SDWebImage 中删除图像缓存

ios - 从 iOS 发送 C++ Protocol Buffer 消息

ios - Swift 协议(protocol)委托(delegate)返回 nil

ios - 是否有 GCD 等同于设置可以取消并在以后重新安排的计时器?

objective-c - 具有多个参数的 performSelectorInBackground

ios - TransformedValueClass 返回 AnyObject 类型的数组

objective-c - 循环移动背景 Objective-C

ios - UITableView 部分之间的空间是多少?