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

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

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

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

5
Alexander Borisenko 13 Сен 2013 в 19:36
Удалось ли вам найти лучший способ сделать это? Если да, не могли бы вы сообщить мне об этом? Я тоже сталкиваюсь с той же проблемой.
 – 
user805981
16 Июн 2015 в 16:35

1 ответ

Лучший ответ

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

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

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

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

4
nrj 13 Сен 2013 в 20:15
12
Это действительно смешно и приводит к совершенно отвратительному коду для любых сложных макетов ячеек. Поразительно, что у Apple до сих пор нет лучшего API для такого основного компонента.
 – 
Alex B
23 Июн 2014 в 19:05