如何解决表格视图中的布局集合视图单元格
我确实想在表视图单元格中布局集合视图。集合视图的单元格应该在顶部对齐,并且这些单元格正在使用自动版式。集合视图的单元格大小是动态的。
我将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
。
在此先感谢:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。