使用标题单元格时不尊重 UICollectionView sectionInsets

Posted

技术标签:

【中文标题】使用标题单元格时不尊重 UICollectionView sectionInsets【英文标题】:UICollectionView sectionInsets not respected when using Header Cells 【发布时间】:2020-01-15 21:34:48 【问题描述】:

我正在尝试创建一个包含标题单元格(动态大小)和一些“正常”内容单元格(也是动态大小)的集合视图。因此,collection view 初始化如下:

private lazy var timelineCollectionView: UICollectionView = 
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.scrollDirection = .vertical
        flowLayout.sectionInset = UIEdgeInsets(top: self.coloredTitleBarHeight, left: 0, bottom: 0, right: 0) // assume that coloredTitlebarHeight is a constant of 120
        flowLayout.estimatedItemSize = CGSize(width: self.view.frame.width, height: 10)
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.minimumLineSpacing = 0

        let cv = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
        cv.alwaysBounceVertical = true
        cv.contentInsetAdjustmentBehavior = .never 
        cv.backgroundColor = .clear
        cv.scrollIndicatorInsets = UIEdgeInsets(top: self.coloredTitleBarHeight - self.getStatusBarHeight(), left: 0, bottom: 0, right: 0)

        cv.delegate = self
        cv.dataSource = self
        cv.register(TLContentCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "content-header-cell")
        cv.register(TLContentCell.self, forCellWithReuseIdentifier: "comment-cell")

        return cv
    ()

collectionView 是 符合以下协议的 ViewController 的一部分:UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

然后,我使用以下代码创建一个标题单元格:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 
        let cell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "content-header-cell", for: indexPath) as! TLContentCell

        cell.timelineContent = tlContentItem
        cell.delegate = self

        return cell
    

最后但同样重要的是,常规单元的出队:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 1
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "comment-cell", for: indexPath)

        return cell
    

输出:

collectionView 显示标题单元格以及项目单元格,但是,不应用部分 Insets。

如果您能就这种奇怪的行为向我提供任何建议,我将非常高兴。

【问题讨论】:

【参考方案1】:

Section insets 仅应用于 UICollectionViewFlowLayout 中的内容。

使用部分插图调整内容的边距

部分插图是一种调整可用于布置单元格的空间的方法。 您可以使用 insets 在节的标题视图之后插入空格,并 在其页脚视图之前。您还可以使用 insets 在周围插入空格 内容的侧面。图 3-5 演示了插图如何影响 垂直滚动流布局中的一些内容。 source

【讨论】:

感谢您的回复。但是我怎样才能创建一个“上边距”呢?有什么想法吗?

以上是关于使用标题单元格时不尊重 UICollectionView sectionInsets的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?

在添加 LinkPresentation 视图的堆栈上重用单元格时不显示元素

集合视图更改单元格大小

UICollectionViewCell 在选择时不改变颜色

QChart z 值在使用 openGL 加速时不受尊重?

RecyclerView 在回收视图时不尊重翻译