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

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

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

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

Итак, если кто-то может пролить свет на то, какая логика стоит за этим, я был бы признателен.

7
задан Ajumal 27 April 2015 в 09:40
поделиться