我正在尝试测量要绘制的字符串。我尝试过 sizeWithAttributes:
,但这对不同字符没有区别:
NSLog(@"A: %@", NSStringFromCGSize([@"." sizeWithAttributes:labelAttributes]));
NSLog(@"B: %@", NSStringFromCGSize([@"X" sizeWithAttributes:labelAttributes]));
A: {6, 23}
B: {12, 23}
请注意,两个字符的报告高度相同。是否有一个调用可以尊重 .
和 X
之间的高度差?
最佳答案
不存在“真实高度”这样的东西。字体规范是一个复杂的主题。
字符串(由字符组成)被转换为一堆字形。这些字形定义了可见(渲染)的内容。这个过程涉及无尽的微妙之处,可能会改变您对“真实高度”的定义。
示例:
- 某些字符非常超出正常行高。
- 某些(图形)渲染选项超出了所有字形的边界框(例如阴影或轮廓)。
- 字体规范包含无数不同的值,这些值可被视为字符(或字形)的边界框。
此图像显示使用 Zapfino 字体(在 Mac 上的 TextEdit.app 中)呈现的字符串 “abc f 123”
。 f 字符被选中(绿色框)。视觉特征远远超出了选择范围所考虑的边界框。
红色文本应用了阴影。计算这部分文本的边界框也不容易。
您的情况听起来像是您认为 "."
字符的大小比 "X"
更小。但是空格字符的大小是否为零呢?在不准确了解用例的情况下,很难定义“实际大小”。即使如此,通常也会出现许多未定义的边缘情况。
我有一个用例,我想将字符串转换为 PNG 图像(我知道这很愚蠢)。在这种情况下,最好的选择是将字符串渲染到一个大的位图上下文中,然后从外向内搜索原始数据位平面,直到找到第一个非透明像素。
关于ios - 如何测量渲染字符串的实际高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25323983/