Высота кадра 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 в соответствии с этой высотой? Это кажется избыточным, и мне нужно создать механизм для обнаружения, когда ячейка создается впервые с неправильной высотой кадра по сравнению с тем, когда позже она удаляется с правильной высотой кадра, чтобы избежать этой избыточности.
Поэтому, если кто-то может пролить некоторый свет на то, что за этим стоит, я буду признателен за это.