UICollectionViewFlowLayout子类Sticky和Stretchy标头

时间:2017-07-27 13:05:29

标签: ios swift xcode uicollectionview uicollectionviewlayout

我使用具有唯一部分的UICollectionView来分割大视图的逻辑。这个有HeaderView有一张照片,我试图让这个标题变得粘稠和有弹性(当你向下滚动标题变得很小,直到只是一个条形并坚持到顶部,当你向上滚动并且反弹,标题回到图片并伸展)。

我已经阅读并观看了许多教程,并尝试自己实现,但每次都发生了相同的行为:

单元格不再滚动,标题向下滑动。

每次我打电话的时候:

collectionViewLayout.invalidateLayout()

集合视图在没有动画的情况下滚动回顶部。

下面,只有弹性部分!

这是我的CustomCollectionViewFlowLayout的代码:

class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let layoutAttributes = super.layoutAttributesForElements(in: rect),
            let collectionView = collectionView else {
            return nil
        }

        let offset = collectionView.contentOffset
        if offset.y < 0 {
            let deltaY = abs(offset.y)
            for attributes in layoutAttributes {
                if attributes.representedElementKind == UICollectionElementKindSectionHeader {
                    var frame = attributes.frame
                    frame.size.height = max(0, headerReferenceSize.height + deltaY)
                    frame.origin.y = frame.minY - deltaY
                    attributes.frame = frame
                }
            }
        }

        return layoutAttributes
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }

}

这是我如何将它与CollectionViewController链接:

override func viewDidLoad() {
    super.viewDidLoad()

    if let flowLayout = collectionViewLayout as? PINPropertyDetailsCollectionViewFlowLayout {
        let side = collectionView?.frame.width ?? 375
        flowLayout.headerReferenceSize = CGSize(width: side, height: side)
        flowLayout.estimatedItemSize = CGSize(width: side, height: 1)
    }
    collectionView?.contentInset = UIEdgeInsets(top: -20, left: 0, bottom: 0, right: 0)
}

我尝试使用:

flowLayout.sectionHeadersPinToVisibleBounds = true

以及没有更多结果:没有(单元格或标题)滚动了...

我使用Xcode 9(beta 4)编码iOS 9&amp; 10。

感谢您的反馈:)

1 个答案:

答案 0 :(得分:1)

我已通过实施UICollectionViewDelegateFlowLayout和方法collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize来解决此问题。

如果没有固定的物品尺寸,显然不可能产生弹性效果(直到现在我使用的是自动尺寸)