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

У меня есть 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 "; 

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

ADD:

size.width;

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

Ответ 1

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

– sizeWithFont:forWidth:lineBreakMode: 

предназначен для "вычисления метрик для отдельной строки текста", тогда как

-sizeWithFont:constrainedToSize:lineBreakMode:

предназначен для "вычисления метрик для нескольких строк текста". Из documentation:

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

– 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;

Ответ 2

В соответствии с Documentation

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

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