表格视图中的布局集合视图单元格

时间:2020-11-11 13:53:55

标签: ios swift uicollectionview uicollectionviewlayout uicollectionviewflowlayout

我确实想在表视图单元格中布局集合视图。集合视图的单元格应该在顶部对齐,并且这些单元格正在使用自动版式。集合视图的单元格大小是动态的。

我将UICollectionViewFlowLayout

子类化了
class AlignTopCollectionViewLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {

        guard let collectionView = collectionView,
              let layoutAttributes = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes else {
            return nil
        }

        layoutAttributes.frame.origin.y = sectionInset.top
        layoutAttributes.frame.size.width = collectionView.bounds.width - sectionInset.left - sectionInset.right
        return layoutAttributes
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

        let layoutAttributesObjects = super.layoutAttributesForElements(in: rect)?.map({ (layoutAttributes) -> Any in
            layoutAttributes.copy()
        }) as? [UICollectionViewLayoutAttributes]

        layoutAttributesObjects?.forEach({ (layoutAttributes) in

            guard layoutAttributes.representedElementCategory == .cell,
                  let newFrame = layoutAttributesForItem(at: layoutAttributes.indexPath)?.frame else {
                return
            }

            layoutAttributes.frame = newFrame
        })
        return layoutAttributesObjects
    }
}

在集合视图的单元格中,我覆盖了preferredLayoutAttributesFitting(:_)

class CollectionViewCell: UICollectionViewCell {

    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        layoutAttributes.frame.size = contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
        return layoutAttributes
    }
}

最后,包含集合视图的表视图单元格具有估计的项目大小,并且sizeForItemAt委托函数已被删除

class TableViewContainerViewCell: UITableViewCell {

@IBOutlet private weak var collectionView: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Register cell
        collectionView.dataSource = self
        collectionView.delegate = self

        if let collectionViewFlowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            collectionViewFlowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        }
    }

    func collectionView(_ collectionView: UICollectionView,
                        numberOfItemsInSection section: Int) -> Int {
        data?.totalCount ?? 0
    }

    func collectionView(_ collectionView: UICollectionView,
                        cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let data = data else {
            return UICollectionViewCell()
        }

        let cell = IncentiveCollectionViewCell.dequeue(from: collectionView,
                                                       at: indexPath)
        // setup the cell
        return cell
    }
}

我遇到的问题是,在显示视图后调用.reloadData()时,UI的布局正确。我发现有趣的是,super.layoutAttributesForItem(at: indexPath)中的func layoutAttributesForItem(at:)返回的高度为50.0。 在此先感谢:)

0 个答案:

没有答案