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

Sea*_*ser 12 autolayout uicollectionview

我正在使用带有Flow布局的UICollectionView,并尝试根据AutoLayout约束使collectionView适当调整单元格的大小.

虽然单元格按预期工作,但我遇到的问题是我添加到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
}()
Run Code Online (Sandbox Code Playgroud)

2.使用AutoLayoutCollectionViewCell的子类

class AutoLayoutCollectionViewCell: UICollectionViewCell {
    override func preferredLayoutAttributesFittingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        layoutIfNeeded()
        layoutAttributes.bounds.size.height = systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
        return layoutAttributes
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此时,一切都按预期工作.

下一步是我们失败的地方.

3.提供标题的参考大小

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSizeMake(CGRectGetWidth(collectionView.frame), 30.0) 
Run Code Online (Sandbox Code Playgroud)

}

我的问题是:为什么会这样?我怎样才能纠正这个问题?我怎么能处理自我调整其细胞大小的collectionView中的补充​​视图?

小智 14

我有同样的问题,为我解决的是子类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
}
Run Code Online (Sandbox Code Playgroud)