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

时间:2017-04-12 23:02:02

标签: ios objective-c iphone nsstring

我已经查看了几个Stackoverflow问题,其中人们遇到了boundingRectWithSize的问题,但没有一个是我的问题。

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

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

例如,字符串地图类型: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模拟器中打开了颜色混合标签,因此子视图将被着色以说明:

enter image description here

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我之前遇到过类似的事情,虽然它没有归因于字符串。当它发生在我身上时,标签的框架还没有完全设置,所以在计算时宽度足够窄,它必须包裹到下一行。在进行此计算时检查标签的框架,并确保它实际上与您认为的一样宽。