NSString boundingRectWithSize边界未得到遵守

时间:2013-10-03 15:55:18

标签: nsstring uikit ios7

有没有人知道在这里工作或我目前做错了什么。

CGSize boundingSize = CGSizeMake(288, 9999);

CGRect boundingRect = [text boundingRectWithSize:boundingSize 
                                                 options:NSStringDrawingUsesLineFragmentOrigin
                                              attributes:[NSDictionary dictionaryWithObjectsAndKeys:theFont, NSFontAttributeName, nil]
                                                 context:nil];

当代码在iOS7上运行时(手机和SIM卡上),返回的大小为416.3宽,高度为15.5。很明显,只是忽略了boundingRectWithSize。有没有其他人遇到这个,如果有的话,有人知道如何解决它或有人指出我在哪里我错了。

3 个答案:

答案 0 :(得分:3)

根据Apple documentation

  

您可以使用此方法计算绘制所需的空间   串。您在size参数中指定的约束是指南   对于渲染器如何调整字符串的大小。但是,实际   此方法返回的边界矩形可以大于   约束是否需要额外的空间来呈现整个字符串。   通常,渲染器会保留宽度约束并调整   根据需要进行高度约束。

如果您指定固定字体且空间太小,则必须提供一些内容。在这种情况下,它是边界空间。我猜你期待换行。 288的宽度是否允许任何合理的包裹?

答案 1 :(得分:1)

我知道这是一个老问题,但我找到了解决问题的方法。下面是代码示例

1)首先创建一个最小高度的宏

#define MIN_HEIGHT 10.0f

2)之后使用下面的代码根据您指定的文本给出可变高度。但为此,您需要指定UILabel的框架或用于显示文本的任何内容。

// Initialize UILabel with initial frame.
UILabel *lblMakeModel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 180, 50)];
// Set numberOfLines as zero
lblMakeModel.numberOfLines = 0;
// Set text here
lblMakeModel.text = @"sdbsbdjhsbdhjsbdhjasd bhbdhjasbdsahjdbahjsdbjhsd bdhjsabdhjsbdhsbdhsad dhbsadbasdhbsajhdbsadyogi";
// create a constraint for fixed width and maximum 20000 height.
CGSize constraint = CGSizeMake(lblMakeModel.frame.size.width, 20000.0f);
// Get the CGRect with the given constraint for the text of UILabel
CGRect textRect = [lblMakeModel.text boundingRectWithSize:constraint
                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                      attributes:@{NSFontAttributeName:lblMakeModel.font}
                                         context:nil];

// Set LineBreakMode for UIlabel
[lblMakeModel setLineBreakMode:NSLineBreakByWordWrapping];
[lblMakeModel setAdjustsFontSizeToFitWidth:NO];
// Again set the frame from the height you get from CGRect object.
[lblMakeModel setFrame:CGRectMake(lblMakeModel.frame.origin.x, lblMakeModel.frame.origin.y, lblMakeModel.frame.size.width, MAX(textRect.size.height, MIN_HEIGHT))];

答案 2 :(得分:0)

方法中仍存在一个真正的错误" boundingRectWithSize",有时它给出的错误宽度大于有限的宽度,我通过这个工作解决了它并在方法后得到标签高度&# 34; sizeToFit"

UILabel *textLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0,maxTextWidth, CGFLOAT_MAX)];

[textLabel setNumberOfLines:0];
[textLabel setFont:Font];
[textLabel setLineBreakMode:NSLineBreakByWordWrapping];
[textLabel setText:@"Text bla bla bla"];
[textLabel sizeToFit];
float height = textLabel.frame.size.height;