我确实想在表视图单元格中布局集合视图。集合视图的单元格应该在顶部对齐,并且这些单元格正在使用自动版式。集合视图的单元格大小是动态的。
我将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
。
在此先感谢:)