CollectionView SizeForItem на основе класса ячеек? - PullRequest
1 голос
/ 27 января 2020

Можно ли включить код sizeForItemAt в динамический c в зависимости от класса ячейки? У меня есть collectionView с большим количеством строк с различными типами ячеек, но не в каком-либо конкретном шаблоне c (было бы сложно ввести 'if index path.row == 29' и т. Д. Для каждой ячейки).

Я пробовал варианты приведенного ниже кода, но он всегда возвращает значение по умолчанию (иначе). Фрагмент кода здесь имеет 3 типа ячеек (GroupCell, MatchingButtonsCell и MatchingEventCell).

Можно ли сделать размер динамический c на основе класса ячеек?

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if let cell = self.masterCollectionView.cellForItem(at: indexPath) as? GroupCell {
        let cellHeight: CGFloat = (self.view.bounds.height * 0.55)
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
    } else if let cell = self.masterCollectionView.cellForItem(at: indexPath) as? MatchingButtonsCell {
        let cellHeight: CGFloat = 60
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
    } else if let cell = self.masterCollectionView.cellForItem(at: indexPath) as? MatchingEventCell {
        let cellHeight: CGFloat = 500
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
    } else {
        let cellHeight: CGFloat = 10
        let cellWidth: CGFloat = self.masterCollectionView.frame.width
        return CGSize(width: cellWidth, height: cellHeight)
    }

}

Заранее спасибо !

1 Ответ

2 голосов
/ 27 января 2020

Могу ли я сделать динамический размер c на основе класса ячеек?

В основном нет. Проблема в том, что вы предполагаете, что во время вызова sizeForItemAt есть «ячеек», в которых элементы go. Но это не обязательно так. Насколько вам известно, sizeForItemAt вызывается до того, как появятся любых"ячеек", когда представление коллекции все еще планирует свое расположение.

Именно поэтому вам не дают ячейку в звонок. Вам дан индексный путь . И это должно быть все, что вам нужно. Вы должны быть в состоянии дать ответ, основываясь на индексном пути 1016 *, а не на «ячейке».

И это должно быть легко. В конце концов, предположительно, вы устанавливаете класс ячеек в вашей реализации cellForItemAt - и вы должны делать это на основе пути индекса, потому что это вся информация, которая у вас есть. Что ж, если вы можете сделать это на основе пути индекса, сделайте это на основе пути индекса здесь.

...