Как я могу динамически изменять размеры различных UICollectionViewCells, размеры которых зависят от того, в каком разделе представления коллекции они находятся? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть один UICollectionView с 3 различными разделами. Каждый раздел использует свой класс UICollectionViewCell для своих ячеек. Размер каждой ячейки не является фиксированным и зависит от размера ее содержимого. Я не могу понять, как динамически изменить размер нескольких различных классов ячеек в нескольких разделах представления коллекции.

Swift 4

Я пытался использовать этот блок кода на контроллере представления, который содержит UICollectionView (registerNib метод - это пользовательский метод, который я построил):

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.dataSource = self
        collectionView.delegate = self

        collectionView.registerNib(name: FirstSectionCollectionViewCell.reuseIdentifier)
        collectionView.registerNib(name: SecondSectionCollectionViewCell.reuseIdentifier)
        collectionView.registerNib(name: ThirdSectionCollectionViewCell.reuseIdentifier)

        if let collectionViewLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
            collectionViewLayout.itemSize = UICollectionViewFLowLayout.automaticSize
            collectionViewLayout.estimatedItemSize = CGSize(width: collectionView.bounds.width, height: 150)
        }
    }

, а затем это внутри КАЖДОГО из классов UICollectionViewCell:

   override func awakeFromNib() {
        super.awakeFromNib()

        // stuff
    }

    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        setNeedsLayout()
        layoutIfNeeded()
        let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
        var frame = layoutAttributes.frame
        frame.size.height = ceil(size.height)
        layoutAttributes.frame = frame
        return layoutAttributes
    }

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

Я предполагаю, что мне нужно сделать что-то особенное внутри метода UICollectionView sizeForItemAt иизменить размер ячеек там, но я не уверен, как это сделать для динамического изменения размера. Я думаю, это будет выглядеть примерно так:

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

        let width: CGFloat = collectionView.bounds.width
        var height: CGFloat = 0

        switch indexPath.section {
        case 0:
            height = // Need dynamic resizing here
        case 1:
            height = // Need dynamic resizing here
        case 2:
            height = // Need dynamic resizing here
        }

        return CGSize(width: width, height: height)
    }
...