boundingRectWithSize 有时 returns 高度大约 1 行太高

boundingRectWithSize sometimes returns height that is about 1 line too tall

我看过几个 Whosebug 问题,其中人们对 boundingRectWithSize 有疑问,但 none 是我的问题。

以下代码计算的高度通常比 1 行文本高。

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

例如,字符串 Map Type: USGS Topo 大约是我视图宽度的一半,应该是 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 个标签最终尺寸正确,但顶部的两个标签尺寸不正确。我在 iOS 模拟器中打开了颜色混合标签,因此子视图将被着色以说明:

不久前我也遇到过类似的事情,但不是带有属性字符串。当它发生在我身上时,标签的框架还没有完全设置,所以在计算时宽度足够窄,它必须换行到下一行。进行此计算时请检查标签的框架,并确保它实际上与您想象的一样宽。

您的字符串中可能有尾随换行符。尝试用 whitespaceAndNewlineCharacterSet.

修剪它