UICollectionViewFlowLayout子类Sticky和Stretchy标头

问题描述 投票:0回答:1

我使用带有独特部分的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

没有更多的结果:没有(细胞或标题)滚动了...

我在iOS 9和10中使用Xcode 9(beta 4)编码。

感谢您的反馈:)

ios swift xcode uicollectionview uicollectionviewlayout
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.