Вызов `[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) не должен удовлетворять всем ограничениям.
Любые идеи?
Ответы
Ответ 1
Это то, что работает для меня (примечание 'contentView')
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
EDIT: я ответил на аналогичный вопрос и привел полный пример:
Как изменить размер супервизора для соответствия всем подзонам с автозапуском?
Ответ 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
Проблема с вашим подходом с использованием ограничений может заключаться в том, что вы хотите измерить ячейку, которая НЕ добавляется в представление, чтобы система не располагала всей необходимой информацией. Он не знает, сколько места будет занимать пространство и т.д., Потому что он не знает окрестность ячейки