UILabel sizeToFit / sizeThatFits игнорирует свойство numberoflines

Проблема: Определите размер (количество строк), необходимый для UILabel , при условии, что ширина 300 пикселей. Строка длиннее, поэтому я установил lineBreakMode на UILineBreakModeWordWrap и вызвал sizeThatFits , чтобы попытаться определить размер. Но он дает ширину 457 пикселей в одной строке, а не ожидаемые 300 пикселей в двух строках.

См.:

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 пикселей. , а пользовательский интерфейс отображает одну строку с обрезанным текстом. Я ожидаю ширину 300 пикселей и высоту 44 пикселей для двух строк.

В документе UILabel для numberoflines говорится:

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

Я пробовал различные комбинации:

  1. Передача CGRectZero в функцию init, передавая 300x400 или 300 x бесконечность.
  2. Установка кадра после создания, а не передача его функции init .
  3. Вызов [sizeToFit] ] и надеется, что он вычислит высоту, принимая текущую ширину, но это не так.
  4. Вызов sizeToFit, а затем вызов sizeThatFits`.
  5. Вызов layoutIfNeeded .

Ни один из них не работает. Что я делаю не так, или это плохая ошибка, когда документация и реализация фреймворка не совпадают? Спасибо.

37
задан Rishil Patel 26 March 2018 в 06:26
поделиться