我正在尝试测量要绘制的字符串。我尝试了sizeWithAttributes:
,但这并没有区别不同的字符:
NSLog(@"A: %@", NSStringFromCGSize([@"." sizeWithAttributes:labelAttributes]));
NSLog(@"B: %@", NSStringFromCGSize([@"X" sizeWithAttributes:labelAttributes]));
A: {6, 23}
B: {12, 23}
请注意,两个字符的报告高度相同。是否有电话会尊重.
和X
之间的高度差?
答案 0 :(得分:3)
没有"真正的高度"。字体指标是一个复杂的主题。
字符串(由字符组成)转换为一串字形。这些字形定义了可见(渲染)的内容。这个过程涉及无穷无尽的细微之处,可能会改变你所定义的真实高度"。
示例:
此图像显示使用字体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。