Collectionview в ячейке collectionview, подходящей к содержанию - PullRequest
0 голосов
/ 20 января 2019

У меня есть просмотр коллекции с двумя разделами, каждый раздел имеет один элемент.Ячейка в разделе содержит представление коллекции, и мне нужно подогнать ячейку высоты к представлению коллекции контента.

Моя первая секция имеет фиксированную высоту до 120, потому что это горизонтальный вид коллекции и высота не изменилась.Но для второго раздела количество элементов может быть изменено, и мне нужно отобразить все элементы (collectionview имеет scrollEnabled в false и scrolldirecton в вертикальном).

Моя проблема заключается в том, что мне нужно отобразить коллекционное представление с двумя разделами в зависимости от направления прокрутки иотображать все элементы для вертикального просмотра коллекции.

Когда я делаю collectionview.collectionViewLayout.collectionViewContentSize.height, у меня хорошая высота, но я не знаю, как передать эту высоту родительскому viewcontroller.Я ищу динамическое решение, чтобы исправить это.

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    // MARK: - UICollectionViewDataSource

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return presenter.numberOfSections // == 2
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return presenter.numberOfItemsInSection // == 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueCell(InlineDisplayCollectionViewCell.self, for: indexPath)
        configureCell(cell, at: indexPath)

        return cell
    }

    // MARK: - UICollectionViewDelegateFlowLayout

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let type = presenter.typeAtIndexPath(indexPath)
        switch type {
        case .city:
            return CGSize(width: collectionView.frame.width, height: 120)
        case .suggestion:
            return CGSize(width: collectionView.frame.width, height: 820)
        default:
            return CGSize.zero
        }
    }


}


class InlineDisplayCollectionViewCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var collectionView: UICollectionView!

    var itemType: ItemModelCollectionType! = .city {
        didSet {
            updateCell()
        }
    }
    var cities: [City]? {
        didSet {
            collectionView.reloadData()
        }
    }
    var suggestions: [Suggestion]? {
        didSet {
            collectionView.reloadData()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        configureView()
    }

    // MARK: - UICollectionViewDataSource

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return itemType == .city ? cities?.count ?? 0 : suggestions?.count ?? 0
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell: UICollectionViewCell
        if itemType == .city {
            let cityCell = collectionView.dequeueCell(CityCollectionViewCell.self, for: indexPath)
            configure(cell: cityCell, at: indexPath)
            cell = cityCell
        } else {
            let suggestionCell = collectionView.dequeueCell(SquareCollectionViewCell.self, for: indexPath)
            configure(cell: suggestionCell, at: indexPath)
            cell = suggestionCell
        }
        return cell
    }

    // MARK: - UICollectionViewDelegateFlowLayout

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return itemType == .city ? 10 : 10
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return itemType == .city ? 0 : 10
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let size: CGSize
        if itemType == .city {
            size = CGSize(width: 100, height: 120)
        } else {
            let width = (collectionView.frame.width - (collectionView.contentInset.left + collectionView.contentInset.right) - 10) * 0.5
            let height = width
            size = CGSize(width: width, height: height)
        }

        return size
    }

    // MARK: - Private functions

    private func configureView() {
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
        collectionView.registerNib(CityCollectionViewCell.self, bundle: nil)
        collectionView.registerNib(SquareCollectionViewCell.self, bundle: nil)
    }

    private func updateCell() {
        if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            flowLayout.scrollDirection = itemType == .city ? .horizontal : .vertical
        }
        collectionView.isScrollEnabled = itemType == .city
    }

    private func configure(cell: CityCollectionViewCell, at indexPath: IndexPath) {
        guard let city = cities?[indexPath.row] else { return }
        cell.configure(with: city)
    }

    private func configure(cell: SquareCollectionViewCell, at indexPath: IndexPath) {
        guard let suggestion = suggestions?[indexPath.row] else { return }
        cell.configure(with: suggestion)
    }

}

1 Ответ

0 голосов
/ 20 июня 2019

Вы не можете этого сделать.Ячейки CollectionView удаляются из очереди и используются динамически.Лучший способ сделать это - использовать разные типы ячеек в одном и том же CollectionView.

Пожалуйста, проверьте вопросы, которые я отправил по этой теме: Получите сумму высот всех collectionViewCells внутри CollectionView и Несколько ячеек для комментариев и ответа в CollectionView

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