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

时间:2014-08-15 09:14:03

标签: ios cocoa-touch

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

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

请注意,两个字符的报告高度相同。是否有电话会尊重.X之间的高度差?

2 个答案:

答案 0 :(得分:3)

没有"真正的高度"。字体指标是一个复杂的主题。

字符串(由字符组成)转换为一串字形。这些字形定义了可见(渲染)的内容。这个过程涉及无穷无尽的细微之处,可能会改变你所定义的真实高度"。

示例:

  • 有些字符在正常行高处延伸非常
  • 某些(图形)渲染选项会延伸到所有字形的边界框之外(如阴影或轮廓)。
  • 字体指标包含大量不同的值,可用于考虑字符(或字形)的边界框。

Zapfino Glyphs

此图像显示使用字体Zapfino(在Mac上的TextEdit.app中)呈现的字符串"abc f 123"。选择了f字符(绿色框)。视觉角色的范围远远超出选择范围内的范围。

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

您的情况听起来好像您认为"."字符的尺寸小于"X"。但是空间字符的大小是零吗?确定"实际尺寸"真的很难。没有用例的确切知识。即使这样,通常还会有许多未定义的边缘情况。

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

答案 1 :(得分:0)

同意尼古拉。我认为你能做的最好的事情就是尽可能减小尺寸。

self.myLabel.text = @".";
[self.myLabel setNeedsLayout];
[self.myLabel layoutIfNeeded];

NSLog(@"A: %@", NSStringFromCGSize([self.myLabel systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]));

self.myLabel.text = @"X";
[self.myLabel setNeedsLayout];
[self.myLabel layoutIfNeeded];

NSLog(@"B: %@", NSStringFromCGSize([self.myLabel systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]));

A: {5, 21}
B: {11, 21}

如果您想要尽可能小的尺寸,请传递UILayoutFittingCompressedSize;对于最大可能的大小,传递UILayoutFittingExpandedSize。