13

有谁知道解决方法或我目前在这里做错了什么。

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 只是被忽略了。有没有其他人遇到过这个问题,如果有的话,有人知道如何解决它,或者有人可以指出我哪里出错了。

4

3 回答 3

4

根据Apple 文档

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

如果你指定了一个固定的字体并且空间太小,那么就必须给出一些东西。在这种情况下,它是边界空间。我猜你期望换行。288 的宽度是否允许任何合理的换行?

于 2013-10-03T15:59:06.333 回答
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))];
于 2014-07-14T04:08:13.697 回答
0

在“boundingRectWithSize”方法中仍然存在一个真正的错误,有时它给出的宽度错误大于限制宽度,我通过这个工作解决了它并在方法“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;
于 2017-07-26T06:48:59.697 回答