Как я могу программно вставить UICollectionView в UITableViewCell? [Swift]

#swift #xcode #uitableview #uicollectionview

#swift #xcode #uitableview #uicollectionview

Вопрос:

Кто-нибудь знает, как интегрировать CollectionView в верхнюю часть TableView? Я пытаюсь получить верхний раздел / строку с горизонтально прокручивающимися изображениями, а другой раздел / строки под ним — просто обычные строки tableview. Например, то, что вы можете увидеть в Facebook Messenger или на странице матчей / бесед tinder / bumble.

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

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

Ответ №1:

  1. объявите CollectionView в файле tableViewCell swift.

    var viewPhotos: UICollectionView!

     func reset(with cellData: CellData) {
         self.data = cellData
         viewPhotos.dataSource = self
         viewPhotos.delegate = self   
         viewPhotos.reloadData()
    }
      
  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)
  
  1. Добавьте источник данных 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
}

}
  
  1. PhotoCollectionViewCell

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

Комментарии:

1. где находится делегат collectionview и источник данных?

2. @ErkamKUCET, вы можете установить делегат и источник данных в методе awakeFromNib, или вы можете определить reset метод, как я сделал на шаге 1).

3. Хорошо, спасибо.