boundingRectWithSize 有时会返回大约 1 行高的高度

Posted

技术标签:

【中文标题】boundingRectWithSize 有时会返回大约 1 行高的高度【英文标题】:boundingRectWithSize sometimes returns height that is about 1 line too tall 【发布时间】:2017-04-12 23:02:02 【问题描述】:

我查看了几个 *** 问题,其中人们在 boundingRectWithSize 方面遇到问题,但没有一个是我的问题。

以下代码通常计算的高度是 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 模拟器中打开了颜色混合标签,这样子视图就会被着色以进行说明:

【问题讨论】:

不确定这是否是原因,但请注意,前两个字符串包括在基线下方绘制的字符(py 在顶部字符串中,()在下一个),而其他三个则没有。 @ravron 是的,我实际上也注意到了这一点,但我尝试更改低于基线的字符并得到相同的结果。 使用标准字体时问题是否仍然存在?我遇到了一些字体问题,这些字体的值很不稳定,从外观上看并不明显。 @ravron 是的,由于其他 SO 线程上的一些 cmets,我尝试过这样做,但我使用系统字体得到了相同的结果: CGFloat height = [[label.attributedText string] boundingRectWithSize:CGSizeMake(label .width, CGFLOAT_MAX) 选项:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 属性:@NSFontAttributeName:[UIFont systemFontOfSize:15] context:nil].size.height; 您确定您的所有字符串都没有以换行符结尾吗? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于boundingRectWithSize 有时会返回大约 1 行高的高度的主要内容,如果未能解决你的问题,请参考以下文章

调用 NSAttributedString.boundingRectWithSize 时应用程序崩溃

boundingRectWithSize 为多行标签返回错误的高度值

boundingRectWithSize:options:attributes:context用法

adjustsFontSizeToFitWidth 或 boundingRectWithSize 何时更改 context.actualScaleFactor?

ios7 - boundingRectWithSize:boundingSize 不返回所需的标签高度

NSString boundingRectWithSize返回不必要的高度