UICollectionView 的标题视图在滚动时不断重复 - 如何创建固定(非粘性)的单个集合视图标题?

Posted

技术标签:

【中文标题】UICollectionView 的标题视图在滚动时不断重复 - 如何创建固定(非粘性)的单个集合视图标题?【英文标题】:Header view of UICollectionView keeps duplicating on scroll - How to create fixed (non-sticky), single collection view header? 【发布时间】:2019-06-18 10:37:54 【问题描述】:

我想实现如下视图层次结构,以便整个视图可以滚动:

UIScrollView

图像视图

集合视图

但是这里很多人都说最好使用集合视图附带的标题。我已经这样做了,但现在我遇到了一个新问题:当我滚动集合视图时,我对 viewForSupplementaryElementOfKind 函数中的标题单元格所做的任何配置都是重复的(例如:如果我以编程方式在 viewForSupplementaryElementOfKind 函数中创建一个新视图,此视图将在我滚动时继续创建)

我有点明白这种情况正在发生,因为我正在使用 dequeueReusableSupplementaryView 将标头出列。但是我已经尝试在 Apple 文档上进行搜索,并且没有其他代码可以用来实例化标题视图而不使其可重用。

有什么方法可以在不使用 UICollectionView 的情况下创建如上所述的视图控制器?

我尝试将节数设置为 1,希望它只能重复使用一次,但它不起作用。

编辑:还尝试使用 UICollectionViewDelegateFlowLayouta 设置标题大小并使用 UICollectionView 而不是 UIViewController 和 UICollectionViewDataSource 等。

func collectionView(_ collectionView: UICollectionView,
                                 viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 

        switch kind 
        case UICollectionView.elementKindSectionHeader:
            guard
                let headerView = collectionView.dequeueReusableSupplementaryView(
                    ofKind: kind,
                    withReuseIdentifier: "DiscoverHeader",
                    for: indexPath) as? DiscoverHeader
                else 
                    fatalError("Invalid view type")
            

            // Rotating arrow image
            headerView.arrowImg.transform = headerView.arrowImg.transform.rotated(by: CGFloat.pi/0.67)

            return headerView
        default:
            assert(false, "Invalid element type")
        

【问题讨论】:

headerView的高度你给了吗? 【参考方案1】:

为什么不在UIScrollView 中使用UIImageViewUICollectionView

您绝对可以创建一个UIScrollView 并在其中添加一个UIImageView 和一个UICollectionView

但这不会按预期工作。这是因为您将scrollView(UICollectionView) 嵌入到另一个scrollView 中。 ScrollingcollectionView 垂直会阻碍外部scrollViewscrolling

解决方案:

尝试使用UICollectionViewDelegateFlowLayout's 方法给出header viewheight

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize 
    return CGSize(width: collectionView.bounds.width, height: 100.0) //give the height as per your requirement...

另外,将imageViewcontentMode 设置为Aspect Fit / Aspect Fill

【讨论】:

嗨对不起,我想我应该在我的帖子中包含它,我已经使用 UICollectionViewDelegateFlowLayout 以编程方式设置标题大小,并将 imageView 设置为 Aspect Fill :( 请添加您所获得的屏幕截图作为输出。

以上是关于UICollectionView 的标题视图在滚动时不断重复 - 如何创建固定(非粘性)的单个集合视图标题?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionVIew:在视图滚动时为单元格设置动画

UICollectionView 的标题视图在滚动时不断重复 - 如何创建固定(非粘性)的单个集合视图标题?

数据不会填充 UICollectionView 滚动视图

UICollectionView 子视图平移移动而不滚动

以编程方式禁用 UICollectionView 中的垂直滚动

以编程方式滚动到 UICollectionView 中的补充视图