2013-10-03 3 views
12

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

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

+0

Вы поняли это? –

+0

У меня та же проблема –

ответ

3

Согласно Apple documentation:

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

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

+2

Это хорошо и хорошо, но я прошу его нарисовать текст в пространстве шириной 288 и 9999. Он возвращает значение 416 в ширину и 15 высоко. Очевидно, ему было предоставлено достаточно места для его высоты. Я просто хочу, чтобы ширина была фиксированной, и она вернула мне высоту, но, похоже, там есть какая-то проблема. Есть ли что-то, что нужно сделать, что я просто пропущу? – BrettS

+0

Разрывы строк установлены на Word Wrap, а для параметра Autoshrink установлено значение Fixed Font Size. – BrettS

+0

Что произойдет, если вы попросите его рисовать в пространстве, указанном с помощью 'drawInRect:'? –

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))]; 
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; 
Смежные вопросы