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
.
修剪它
我看过几个 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
.