Как я могу программно вставить UICollectionView в UITableViewCell? [Swift] - PullRequest
0 голосов
/ 01 апреля 2019

Кто-нибудь знает, как интегрировать collectionView в верхнюю часть tableView? Я пытаюсь получить верхний раздел / строку с горизонтально прокручивающимися изображениями, а другие разделы / строки под ним, чтобы они были обычными строками таблицы. Как то, что вы можете увидеть в приложении, таком как Facebook Messenger или на странице матчей / разговоров Tinder / Bumble.

Я понимаю, как создавать UICollectionView и UITableView по отдельности, но между несколькими функциями / делегатами / источниками данных я не могу понять, как правильно распределить код по слоям.

Я работаю программно, а не на раскадровке. Я знаю, что есть другие посты о вставке UICollectionView в UITableViewCell, но они либо являются реализациями раскадровки, либо о устаревших версиях Swift - было бы здорово, если бы кто-то мог выполнить прогон, чтобы любой, кто заглядывал в будущее, мог также понять логику даже если часть кода устарела.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019
  1. объявить collectionView в файле Swift TableViewCell.

    var viewPhotos: UICollectionView!

  2. в функции init или awakeFromNib проверьте, инициализирован ли photoCollectionView, и добавьте его в ячейку.

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
 layout.scrollDirection = .horizontal        
 viewPhotos = UICollectionView(frame: self.bounds, collectionViewLayout: layout)
 viewPhotos.collectionViewLayout = layout
 viewPhotos.showsHorizontalScrollIndicator = false
 viewPhotos.isPagingEnabled = true        
 viewPhotos.register(PhotoCollectionViewCell.self, forCellWithReuseIdentifier: PhotoCollectionViewCell.cellIdentifier)
Добавление источника данных UICollectionView и делегирование в UITableViewCell
extension TableViewCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {  

func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection > section: Int) -> Int {
    return photoUrls?.count ?? 0
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell: PhotoCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: PhotoCollectionViewCell.cellIdentifier, for: indexPath) as! PhotoCollectionViewCell

    if let value = photoUrls {
        cell.reset(with url: value[indexPath.row]);
    }
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: kPhotoWidth, height: kPhotoHeight)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt  section: Int) -> UIEdgeInsets {

    return UIEdgeInsets.init(top: 0, left: 0, bottom: 0, right: 0)

}

func collectionView(_ collectionView: UICollectionView, layout > collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 0.0
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 0.0
}

}
PhotoCollectionViewCell

создайте PhotoCollectionViewCell, производный от UICollectionViewCell, и добавьте UIImageView, и установите все ограничения краев в 0 для суперпредставления.загрузить UIImageView на основе photoUrl.

0 голосов
/ 01 апреля 2019

В методе делегата табличного представления tableView(_:viewForHeaderInSection:) вы можете вернуть свой коллекционный вид. Возможно, вам также потребуется установить высоту представления заголовка в tableView(_:heightForRowAt:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...