UICollectionView 自定义布局。不显示或查询补充视图

Posted

技术标签:

【中文标题】UICollectionView 自定义布局。不显示或查询补充视图【英文标题】:UICollectionView custom layout. Supplementary views are not shown or queried 【发布时间】:2017-03-27 12:18:34 【问题描述】:

我正在尝试为 UICollectionView 创建一个简单的自定义布局,以便以编程方式使用(即没有 Interface Builder)。

我按照文档做所有事情:

    子类 UICollectionViewLayout 并准备我的布局 覆盖layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath)并返回相应的布局属性 在我返回补充视图的地方添加 collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) 实现

我的问题是两者都没有

collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath)

也没有

layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath)

正在被调用,所以我看不到补充视图。

我已经仔细检查了我的布局和补充视图创建的实现,但我仍然无法让它工作。

【问题讨论】:

【参考方案1】:

显然拥有是不够的

layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?

返回补充视图的属性。还需要在

中返回补充视图的属性
layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?

我的错误是我只返回单元格的布局属性

layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?

一旦我将补充视图的布局属性添加到返回的值中

layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?

我调用了我的数据源方法并返回了补充视图。

编辑:此答案涵盖 ios10 SDK。我没有尝试过早期版本

【讨论】:

layoutAttributesForItem() ?不适合 RECT? 我相信他的意思是layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?。至少在我的案例中,这就是补充视图所缺少的属性。 这个答案是错误的。来自 layoutAttributesForItem(at indexPath: IndexPath) 的文档:“您使用此方法仅为具有相应单元格的项目提供布局信息。不要将其用于补充视图或装饰视图。”正确的函数是 layoutAttributesForElements(in rect: CGRect):“你的实现应该返回所有可视元素的属性,包括单元格、补充视图和装饰视图。”【参考方案2】:

接受的答案很好,但一些示例代码会有所帮助:

override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? 

    let layoutAttributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: elementKind, with: indexPath)

    if elementKind == UICollectionView.elementKindSectionHeader 
        layoutAttributes.frame = CGRect(x: 0.0, y: 0.0, width: contentWidth, height: headerHeight)
        layoutAttributes.zIndex = Int.max - 3
    

    return layoutAttributes

【讨论】:

以上是关于UICollectionView 自定义布局。不显示或查询补充视图的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 中的自定义布局

具有自定义布局的 UICollectionView 变为空白

Swift 中的 UICollectionView 自定义布局

UICollectionView 自定义布局(---照片浏览器)

UICollectionView 自定义布局。不显示或查询补充视图

使用 Swift 3 在 UICollectionView 上自定义布局