Где определить высоту динамического размера UICollectionViewCell?

Я использую UICollectionViewFlowLayout. Мои ячейки содержат UILabels, которые различаются по высоте (количеству строк).

Кажется, что лучший способ получить высоту ячейки будет в подклассе UICollectionViewCell, потому что именно здесь я устанавливаю макет и имею доступ к внутреннему размеру моих представлений, НО:

collectionView: layout: sizeForItemAtIndexPath: вызывается перед методом делегата collectionView: cellForItemAtIndexPath:, что означает, что мне нужно знать высоту ячейки, прежде чем я получу фактическую компоновку ячейки.

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


person Alexander Borisenko    schedule 13.09.2013    source источник
comment
Вы смогли найти лучший способ сделать это? Если да, не могли бы вы сообщить мне? Я тоже сталкиваюсь с той же проблемой.   -  person user805981    schedule 16.06.2015


Ответы (1)


К сожалению нет.

Для элементов с динамическим размером в UICollectionView вам необходимо знать или вычислять размер ячейки до ее создания. Традиционный способ сделать это — сохранить данные для каждой строки в массиве, а затем вычислить размер этих данных в collectionView:layout:sizeForItemAtIndexPath:.

Например, если у вас есть массив текста для отображения, вы можете сохранить объекты NSString в массиве, измерить эту строку в collectionView:layout:sizeForItemAtIndexPath: и вернуть размер. Затем UICollectionView берет этот размер и вызывает initWithFrame: или setFrame: при настройке представления вашей ячейки.

Также неплохо кэшировать эти размеры, если они не меняются часто.

person nrj    schedule 13.09.2013
comment
Это действительно смешно и приводит к совершенно отвратительному коду для любых сложных макетов ячеек. Удивительно, что у Apple до сих пор нет лучшего API для такого основного компонента. - person Alex B; 23.06.2014