Будьте динамичны, как жизнь ...
Табличные представления и представления коллекций всегда были неотъемлемой частью разработки приложений для iOS. Мы все могли столкнуться с разными проблемами, связанными с ними. В этой статье мы обсудим одну такую постановку проблемы, связанную с представлениями коллекций.
Постановка задачи
Предположим, у нас есть UICollectionView
в UITableViewCell
и около 20 UICollectionViewCells
, которые нам нужно отобразить в нем по вертикали. Мы определенно можем реализовать это в мгновение ока с заданным источником данных.
Теперь перейдем к актуальной постановке проблемы - нам нужно, чтобы UITableViewCell
динамически регулировал его высоту в соответствии с его содержимым. Кроме того, UICollectionView
должен быть таким, чтобы все ячейки отображались за один раз, т.е. прокрутка не разрешалась.
Короче говоря: сделайте все динамичным…
Приступим к кодированию
Представление в iOS вычисляет свою высоту по содержимому, если не предусмотрено ограничение по высоте. То же самое и с UITableViewCell
.
На данный момент мы оставим один collectionView
внутри нашего tableViewCell
с leading, top, trailing and bottom constraints
, установленным на 0.
Поскольку мы не предоставили никаких ограничений по высоте для collectionView
и не знаем его contentSize
заранее, то как tableViewCell
вычислит его высоту?
Решение
Динамическое вычисление collectionView’s
высоты в соответствии с contentSize
- это просто трехэтапный процесс.
1. Подкласс UICollectionView
и переопределите его layoutSubviews()
и intrinsicContentSize
, т. е.
Приведенный выше код аннулирует intrinsicContentSize
и будет использовать фактический contentSize
из collectionView
. В приведенном выше коде также учитывается custom layout
.
2. Теперь установите DynamicHeightCollectionView
как collectionView’s
класс в storyboard
.
3. И последнее, чтобы изменения вступили в силу: вам нужно вызвать layoutIfNeeded()
на collectionView
после перезагрузки collectionView’s
данных, т. е.
func configure(with arr: [String]) { self.arr = arr self.collectionView.reloadData() self.collectionView.layoutIfNeeded() //Here..!!! }
И вот оно!
Образец проекта
Вы можете скачать образец проекта здесь.
дальнейшее чтение
Не забудьте прочитать другие мои статьи:
- Все о Codable в Swift 4
- Все, что вы всегда хотели знать об уведомлениях в iOS
- Глубокая копия против неглубокой копии - и как их можно использовать в Swift
- Кодирование для iOS 11: как перетаскивать в коллекции и таблицы
- Все, что вам нужно знать о расширениях Today Extensions (Widget) в iOS 10
- Выбор UICollectionViewCell стал проще… !!
Не стесняйтесь оставлять комментарии, если у вас возникнут вопросы.