Задача: определить размер (количество строк), который требуется UILabel, при условии, что ширина равна 300 px. Строка длиннее, поэтому я установил lineBreakMode в UILineBreakModeWordWrap и вызвал sizeThatFits, чтобы попытаться определить размер. Но он дает ширину 457 px в одной строке, а не ожидаемую 300px в двух строках.
Пожалуйста, смотрите:
CGSize available = CGSizeMake(300, INFINITY);
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 400)] autorelease];
label.text = title;
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont fontWithName:kBoldFont size:kTitleFontSize];
label.numberOfLines = 3;
CGSize sizedtoFit = [label sizeThatFits:available];
Но я считаю, что переменная sizetoFit имеет ширину 457 пикселей и высоту 22 px, а пользовательский интерфейс отображает одну строку с обрезанным текстом. Я ожидаю ширину 300 пикселей и высоту 44 px для двух строк.
В документе UILabel для numberoflines говорится:
При изменении размера получателя с использованием метода sizeToFit изменение размера учитывает значение, сохраненное в этом свойстве. Например, если для этого свойства установлено значение 3, метод sizeToFit изменяет размер приемника так, чтобы он был достаточно большим, чтобы отображать три строки текста.
Я пробовал различные комбинации:
- Передача CGRectZero функции init, проходящей 300x400 или 300 x бесконечность.
- Настройка кадра после создания, а не передача его в функцию init.
- Вызов [sizeToFit] и надеется, что он вычисляет высоту, предполагающую существующую ширину, но это не так.
- Вызов sizeToFit, а затем вызов sizeThatFits.
- Вызов layoutIfNeeded.
Ни один из них не работает. Что я делаю неправильно, или это плохая ошибка, когда документация и реализация структуры не согласны? Спасибо.