自动调整单元格的UICollectionView错误地定位补充视图

时间:2017-03-29 19:38:32

标签: autolayout uicollectionview

我正在使用带有Flow Layout的UICollectionView,并试图让collectionView根据AutoLayout约束适当调整单元格的大小。

虽然单元格按预期工作,但我遇到的问题是我添加到CollectionView的任何补充视图的布局。

具体来说,在我滚动之后,在“校正”之前,在初始布局上,optionalView将处于错误的位置(即y原点不正确)。

enter image description here

供参考,以下是我配置细胞大小的方法:

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中的补充​​视图?

1 个答案:

答案 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
}