如何使 UICollectionView 的一部分中的所有项目浮动在滚动视图上?

Posted

技术标签:

【中文标题】如何使 UICollectionView 的一部分中的所有项目浮动在滚动视图上?【英文标题】:How to make all items in a section of a UICollectionView float over the scroll view? 【发布时间】:2016-05-31 12:11:53 【问题描述】:

我希望UICollectionView 中的一个section 的项目保持静止,而UICollectionView 中的其余项目正在滚动。

我试图通过设置Autolayout constraint 将项目固定到superviewUICollectionView 来实现这一点。但是,这似乎不起作用,因为 constraints 抱怨 UICollectionViewCellUICollectionView's superview 没有共同的祖先。

还有其他方法可以实现吗?

【问题讨论】:

使用另一个视图.. 不要在集合视图中添加它。 问题是用户需要能够将项目从一个部分拖放到另一个部分。引入另一种视图会使这样做变得更加困难 您是否尝试将标题用于集合视图?如here 所述,可以实现浮动标头 这种方法似乎只适用于补充视图(页眉和页脚),但我需要实际的 UICollectionView 项目保持静止 【参考方案1】:

感谢 Ad-J 的评论,我得以实施该解决方案。

我需要重写UICollectionViewFlowLayout 并实现以下方法:

override func prepareLayout() 
    super.prepareLayout()

    //fill layoutInfo of type [NSIndexPath:UICollectionViewLayoutAttributes]
    //with layoutAttributes you need in your layout

    if let cv = self.collectionView 
        for (indexPath, tileToFloat) in layoutInfo 
            if indexPath.section == 0 
                var origin = tileToFloat.frame.origin
                origin.y += cv.contentOffset.y + cv.contentInset.top
                tileToFloat.frame = CGRect(origin: origin, size: tileToFloat.size)
            
            tileToFloat.zIndex = 1
        
    


override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool 
    return true

这将使第一部分中的所有项目静止。

【讨论】:

以上是关于如何使 UICollectionView 的一部分中的所有项目浮动在滚动视图上?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式使 UICollectionView 填充 UITableViewCell?

如何拥有多个带有标题的 UICollectionView 并使其水平滑动

如何使 UICollectionView 单元格可移动?

如何使 UICollectionView 像书一样翻转整个页面

如何使 UICollectionView 的高度可自动调整和滚动?

将新数据插入核心数据存储时如何使 UICollectionView 始终位于底部