У меня есть UICollectionView
с UICollectionViewFlowLayout
, и я хочу , чтобы вычислить его содержание размера (для возвращения в intrinsicContentSize
необходимости для регулировки его высоты с помощью AutoLayout).
Проблема заключается в следующем: даже если у меня есть фиксированная и равная высота для всех ячеек, я не знаю, сколько «строк» / строк у меня есть в UICollectionView
. Я также не могу определить это количество по количеству элементов в моем источнике данных, поскольку ячейки, представляющие элементы данных, различаются по ширине, следовательно, и количество элементов в одной строке файла UICollectionView
.
Поскольку я не смог найти никаких намеков по этой теме в официальной документации, а поиск в Google не дал мне никаких дальнейших результатов, любая помощь и идеи будут очень признательны.
источник
Если вы используете автоматический макет , вы можете создать подкласс
UICollectionView
Если вы используете приведенный ниже код, вам не нужно указывать какие-либо ограничения по высоте для представления коллекции, так как это будет зависеть от содержимого представления коллекции.
Ниже приводится реализация:
источник
В
viewDidAppear
вы можете получить его:Возможно, когда вы перезагружаете данные, вам нужно рассчитать новую высоту с новыми данными, тогда вы можете получить это: добавьте наблюдателя, который будет слушать, когда вы
CollectionView
закончите перезагрузку данных по адресуviewdidload
:Затем добавьте функцию ниже, чтобы получить новую высоту или сделать что-нибудь после перезагрузки коллекции:
И не забудьте удалить наблюдателя:
источник
user1046037 ответ в Swift ...
источник
UILabel
выше, контент изcollectionView
другого элемента выше, у вас есть другое решение?Swift 3 код для пользователя 1046037 ответ
источник
Swift 4
источник
Swift 4.2
источник
Слишком поздно отвечать на этот вопрос, но я недавно столкнулся с этой проблемой. Ответ
@ lee выше очень помог мне получить ответ. Но этот ответ ограничен objective-c, и я работал быстро .
@lee Что касается вашего ответа, позвольте мне позволить быстрому пользователю легко решить эту проблему. Для этого выполните следующие действия:
Объявите
CGFloat
переменную в разделе объявлений:В
viewDidAppear
вы можете получить его:Возможно, когда вам
reload
нужно вычислить новую высоту с новыми данными, вы можете получить это:addObserver
чтобы прослушать, когда вашиCollectionView
законченные данные перезагрузки будутviewWillAppear
:Затем добавьте функцию ниже, чтобы получить новую высоту или сделать что-нибудь после
collectionview
перезагрузки:И не забудьте удалить наблюдателя:
Надеюсь, это поможет вам быстро решить вашу проблему.
источник
Этот ответ основан на @Er. Ответ Вихара. Вы можете легко реализовать решение с помощью RxSwift
источник
Быстрая версия @ user1046037:
источник
Swift 4.2, Xcode 10.1, iOS 12.1:
По какой-то причине
collectionView.contentSize.height
он казался меньше разрешенной высоты моего представления коллекции. Во-первых, я использовал ограничение автоматической компоновки относительно 1/2 высоты супервизора.Чтобы исправить это, я изменил ограничение, чтобы оно относилось к «безопасной области» представления.Это позволило мне установить высоту ячейки, чтобы заполнить представление моей коллекции, используя
collectionView.contentSize.height
:Перед
После
источник
предполагая, что ваш collectionView назван как collectionView, вы можете выбрать высоту следующим образом.
источник
Вдобавок лучше позвонить,
reloadData
прежде чем набрать высоту:источник