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 模拟器中打开了颜色混合标签,这样子视图就会被着色以进行说明:
【问题讨论】:
不确定这是否是原因,但请注意,前两个字符串包括在基线下方绘制的字符(p
和 y
在顶部字符串中,(
和 )
在下一个),而其他三个则没有。
@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?