Будьте динамичны, как жизнь ...

Табличные представления и представления коллекций всегда были неотъемлемой частью разработки приложений для 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..!!!
}

И вот оно!

Образец проекта

Вы можете скачать образец проекта здесь.

дальнейшее чтение

Не забудьте прочитать другие мои статьи:

  1. Все о Codable в Swift 4
  2. Все, что вы всегда хотели знать об уведомлениях в iOS
  3. Глубокая копия против неглубокой копии - и как их можно использовать в Swift
  4. Кодирование для iOS 11: как перетаскивать в коллекции и таблицы
  5. Все, что вам нужно знать о расширениях Today Extensions (Widget) в iOS 10
  6. Выбор UICollectionViewCell стал проще… !!

Не стесняйтесь оставлять комментарии, если у вас возникнут вопросы.