Подтвердить что ты не робот

Вызов `[UIView -systemLayoutSizeFittingSize:]` на UITableViewCell всегда терпит неудачу

Я хочу использовать авто-макет для UITableViewCells. Эти ячейки таблицы имеют динамическую высоту (в зависимости от длины текста).

Я использую [UIView -systemLayoutSizeFittingSize:] для вычисления соответствующей высоты ячейки (для возврата в [UITableView -heightForRowAtIndexPath:]), но я продолжаю получать следующие результаты

  • Если я передаю UILayoutFittingCompressedSize, я возвращаю CGSize (0,0).

  • Если я прохожу UILayoutFittingExpandedSize, мое приложение вылетает с этой ошибкой:

    *** Ошибка утверждения в - [NSISLinearExpression incrementConstant:],/SourceCache/Foundation_Sim/Foundation.1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620

(Я предполагаю, что это означает, что некоторое число бесконечно.)

Моя реализация проста. Я вычисляю высоту для каждого объекта, а затем кешу:

MessageCell *cell = // allocate a new cell...

//  set up the cell (assign text, images, etc)

CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

self.cellHeight = size.height;  // size always equals (0, 0)

Я предполагаю, что это проблема с установленными ограничениями, но:

  • Если я вручную установил cellHeight в большое значение, все ячейки выглядят отлично, за исключением того, что высота неправильная.
  • Интерфейс Builder не дает мне никаких предупреждений о неоднозначных ограничениях
  • [cell hasAmbiguousLayout] возвращает NO.
  • У моей ячейки есть, среди прочего, изображение, установленное на 48x48, поэтому размер (0, 0) не должен удовлетворять всем ограничениям.

Любые идеи?

4b9b3361

Ответ 2

Трудно сказать что-то конкретное, основываясь на вашей должности, потому что вы не задавали ограничений, которые вы используете. Документация Apple:

systemLayoutSizeFittingSize:

Возвращает размер представления, который удовлетворяет ограничениям, которые он имеет.

Возможно, вы создали ограничения, которые могут быть интерпретированы так, как размер ячейки равен (0,0).

Существует еще один способ проверить высоту ячейки с текстом. Вы можете поместить свой текст в UITextView, а затем:

UITextView textView; 
textView.text = @"l";
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE];
//some code here
//
CGFloat cellHeight = textView.contentSize.height;

Важно использовать текст и шрифт (и любое другое свойство, которое может вызвать изменение высоты UITextView) UITextView перед использованием свойства contentSize. Также вы должны сначала добавить UITextView в представление.

//////EDIT

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