boundingRectWithSize有时会返回高度约为1的线太高

问题描述:

我已经看过几个Stackoverflow问题,其中人们遇到了boundingRectWithSize问题,但没有一个是我的问题。boundingRectWithSize有时会返回高度约为1的线太高

下面的代码通常会计算高度为1行的文本太高。

CGFloat height = [label.attributedText 
    boundingRectWithSize:CGSizeMake(label.width, CGFLOAT_MAX) 
    options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
    context:nil].size.height; 

例如,串地图类型:USGS地形是我的视图的大约一半的宽度和应为1行高(〜18个像素),但最终具有一个2行高度( 〜36个像素):

我也尝试计算使用的NSString而不是NSAttributedString高度,但同样的事情发生:

CGFloat height = [[label.attributedText string] 
    boundingRectWithSize:CGSizeMake(label.width, CGFLOAT_MAX) 
    options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
    attributes:@{NSFontAttributeName:TITLE_FONT} 
    context:nil].size.height; 

您可以在这张截图的底部3个唱片公司结束了大小正确地看到,但不是前两名。我在iPhone模拟器开启颜色混合标签,让子视图将着色来说明:

enter image description here

+0

不确定是原因,但请注意,最上面的两个字符串包含绘制在基线以下的字符(顶部字符串为'p'和'y',下一个字符为'('和')')而其他三个则没有。 – ravron

+0

@ravron是的,我已经注意到,实际上,但我试图改变基线以下的字符,并有相同的结果。 –

+0

问题是否会以标准字体持续存在?我对字体有问题,这些字体看起来并不明显,这些字体看起来并不明显。 – ravron

您的字符串中可能有一个尾随换行符。尝试用whitespaceAndNewlineCharacterSet修剪它。

我有过类似的事情发生在我身上一段时间以前,虽然这不是用属性串。当它发生在我身上时,标签的框架还没有完全设置,所以在计算时宽度足够窄,不得不缠绕到下一行。在进行此计算时检查标签的框架,并确保其实际上与您认为的一样宽。