我正在使用带有Flow Layout的UICollectionView,并试图让collectionView根据AutoLayout约束适当调整单元格的大小。
虽然单元格按预期工作,但我遇到的问题是我添加到CollectionView的任何补充视图的布局。
具体来说,在我滚动之后,在“校正”之前,在初始布局上,optionalView将处于错误的位置(即y原点不正确)。
供参考,以下是我配置细胞大小的方法:
1。设置collectionViewLayout的估计项目大小
let collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.estimatedItemSize = CGSizeMake(375, 50.0)
layout.minimumInteritemSpacing = 0.0
layout.minimumLineSpacing = 0.0
let view = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
view.backgroundColor = UIColor.whiteColor()
view.alwaysBounceVertical = true
return view
}()
2。使用AutoLayoutCollectionViewCell的子类
class AutoLayoutCollectionViewCell: UICollectionViewCell {
override func preferredLayoutAttributesFittingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
layoutIfNeeded()
layoutAttributes.bounds.size.height = systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
return layoutAttributes
}
}
请注意,此时,一切都按预期工作。
下一步是我们失败的地方。
第3。提供标题的参考大小
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSizeMake(CGRectGetWidth(collectionView.frame), 30.0)
}
我的问题是:为什么会这样?我怎样才能纠正这个问题?我怎么能处理自我调整其单元格的collectionView中的补充视图?
答案 0 :(得分:13)
我有同样的问题,为我解决的是子类UICollectionViewFlowLayout并覆盖以下函数:
override func invalidationContext(forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes, withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutInvalidationContext {
let context = super.invalidationContext(forPreferredLayoutAttributes: preferredAttributes, withOriginalAttributes: originalAttributes)
context.invalidateSupplementaryElements(ofKind: UICollectionElementKindSectionHeader,
at: [originalAttributes.indexPath])
return context
}