Ограничение NSStringRectWithSize не соблюдается

Кто-нибудь знает о работе или о том, что я сейчас делаю неправильно.

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 просто игнорируется. Кто-нибудь еще сталкивается с этим, и если у него есть идея о том, как его исправить, или кто-то может указать мне, где я ошибаюсь.

Ответ 1

В соответствии с Документация Apple:

Вы можете использовать этот метод для вычисления пространства, необходимого для рисования строка. Ограничения, указанные вами в параметре размера, являются руководством для рендерера, как изменить размер строки. Однако фактическое ограничивающий прямоугольник, возвращаемый этим методом, может быть больше, чем ограничений, если требуется дополнительное пространство для отображения всей строки. Как правило, средство визуализации сохраняет ограничение ширины и настраивает ограничение по высоте при необходимости.

Если вы укажете фиксированный шрифт и слишком маленькое пространство, что-то должно дать. В этом случае это ограничивающее пространство. Я предполагаю, что вы ожидали переноса строк. Имеет ли ширина 288 любые разумные обертывания?

Ответ 2

Я знаю, что это старый вопрос, но я нашел обходной путь для вашей проблемы. ниже приведен пример кода

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))];

Ответ 3

В методе "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;