Получите высоту NSString - PullRequest
       25

Получите высоту NSString

11 голосов
/ 06 августа 2011

У меня есть строка NSString, и я хочу знать ее высоту, чтобы создать соответствующую UILabel.

Делаем это

NSString *string = @"this is an example"; 
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:10.0f] 
                          forWidth:353.0 
                     lineBreakMode:UILineBreakModeWordWrap];
float height = size.height;

высота теперь 13,0. Если я использую эту строку

NSString *string = @"this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example "; 

высота всегда равна 13.0 (а при ширине 353 это невозможно) ... что я делаю не так?

ADD:

size.width;

работает нормально ... так что, если lineBreakMode не корректен ... но это так, не правда ли?

Ответы [ 2 ]

21 голосов
/ 06 августа 2011

Причина того, что вы делаете, не работает так, как вы ожидаете, потому что

– sizeWithFont:forWidth:lineBreakMode: 

для "Вычисления метрик для одной строки текста", тогда как

-sizeWithFont:constrainedToSize:lineBreakMode:

для "Вычисления метрик для нескольких строк текста".Из документации :

Вычисление метрик для одной строки текста

– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

Вычисление метрик для нескольких строк текста

– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:

Попробуйте вместо этого использовать -sizeWithFont:constrainedToSize:lineBreakMode:, например, это то, что я обычно делаю:

CGSize maximumLabelSize = CGSizeMake(353,9999);

CGSize expectedLabelSize = [string sizeWithFont:label.font                        
                              constrainedToSize:maximumLabelSize 
                                  lineBreakMode:label.lineBreakMode]; 

CGRect newFrame = label.frame;
newFrame.size.height = expectedLabelSize.height;
label.frame = newFrame;
1 голос
/ 06 августа 2011

Согласно документации

Этот метод возвращает ширину и высоту строки, ограниченной указанная ширина. Хотя он вычисляет, где разрывы строк будут этот метод фактически не переносит текст в дополнительный линий. Если размер строки превышает заданную ширину, этот метод обрезает текст (только для разметки), используя указанную строку режим прерывания, пока он не соответствует максимальной ширине; потом возвращается размер полученной усеченной строки .

Вы должны использовать - [NSString sizeWithFont: constrainedToSize: lineBreakMode:], который имеет похожее поведение, но вы можете использовать CGFLOAT_MAX в качестве высоты переданного размера.

...