Высота кадра UITableViewCell не соответствует tableView: heightForRowAtIndexPath:

Я создаю UITableView с ячейками пользовательской таблицы переменной высоты, высота которых определяется размером многострочного UILabel. Я получилtableView:heightForRowAtIndexPath: Метод делегата подключен и правильно вычисляет окончательную высоту, используяsizeWithFont:constrainedToSize:.

Я столкнулся со странной проблемой: к тому времени метод источника данныхtableView:cellForRowAtIndexPath: вызывается, правильная высота для каждой строки уже была определена, как описано выше, но рамка ячейки не соответствует этой высоте. Вместо этогоframe.size.height свойство ячейки - это высота ячейки по умолчанию для табличного представления (86 пикселей, как я установил в Интерфейсном Разработчике, правильная высота, когда в UILabel содержится только одна строка текста), а не высота, котораяtableView:heightForRowAtIndexPath: определен правильно для этого индекса пути.

Я продуцирую клетки вcellForRowAtIndexPath: с помощью удаления из очереди, то есть

// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel

Таким образом, кажется, что независимо от того, что iOS делает за кулисами, снятие очереди не устанавливает свойство frame ячейки в соответствии с вычисленной высотой. Это само по себе не так уж удивительно, поскольку снятие очереди касается экземпляров ячеек, а не их геометрии. Ячейки отображаются правильно, поэтому свойство высоты устанавливаетсяsomewhere, но это происходит послеcellForRowAtIndexPath:.

Итак: когда я первоначально заполняю табличное представление,cell.frame.size.height 86 для всех ячеек, когда они появляются впервые, когда я прокручиваю список вниз. Так как правильная геометрия устанавливается после первогоcellForRowAtIndexPath: для каждой строки перед ее отображением, когда я прокручиваю назад вверх, свойство высоты является правильным для каждой ячейки, которая возвращается в поле зрения после повторного использования.

После этого я могу прокручивать табличное представление назад и вперед по желанию, и свойство высоты остается правильным для каждой ячейки с этого момента.

Как правильно получить правильную высоту ячейки в первый раз, до того как произойдет повторное использование на основе очереди? Мне нужно, чтобы это немного изменило позиционирование подпредставлений ячейки таблицы. Нужно ли вручную звонитьheightForRowAtIndexPath: вcellForRowAtIndexPath: а затем вручную установить рамку только что созданного экземпляра CustomCell в соответствии с этой высотой? Это кажется избыточным, и мне нужно создать механизм для обнаружения, когда ячейка создается впервые с неправильной высотой кадра по сравнению с тем, когда позже она удаляется с правильной высотой кадра, чтобы избежать этой избыточности.

Поэтому, если кто-то может пролить некоторый свет на то, что за этим стоит, я буду признателен за это.

Ответы на вопрос(3)

Ваш ответ на вопрос