Я создаю 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 за кулисами,удаление из очереди не устанавливает свойство фрейма ячейки в соответствии с вычисленной высотой. Само по себе это не так уж удивительно, удаление из очереди касается экземпляров ячеек, а не их геометрии. Однако ячейки отображаются правильно, поэтому свойство высоты устанавливается где-то , но это происходит после cellForRowAtIndexPath:
.
Таким образом, :, когда я первоначально заполняю представление таблицы, cell.frame.size.height
равно 86 для всех ячеек, поскольку они появляются в первый раз, когда я прокручиваю список вниз. Поскольку правильная геометрия устанавливается где-то после первого cellForRowAtIndexPath:
для каждой строки перед ее отображением, при прокрутке назад свойство высоты будет правильным для каждой ячейки, которая возвращается в поле зрения после повторного использования.
После этого я могу прокручивать представление таблицы вперед и назад по своему желанию, и с этого момента свойство высоты остается правильным для каждой ячейки.
Каков правильный способ получить правильную высоту ячейки в первый раз, прежде чем произойдет повторное использование на основе удаления из очереди -? Мне нужно это, чтобы немного изменить -позиционирование подпредставлений ячейки таблицы. Нужно ли мне вручную вызывать heightForRowAtIndexPath:
в cellForRowAtIndexPath:
, а затем вручную устанавливать рамку только что созданного экземпляра CustomCell в соответствии с этой высотой? Это кажется избыточным, и мне нужно было бы создать механизм для определения того, когда ячейка создается в первый раз с неправильной высотой кадра, а когда позже она удаляется из очереди с правильной высотой кадра, чтобы избежать этой избыточности.
Итак, если кто-то может пролить свет на то, какая логика стоит за этим, я был бы признателен.