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 变为空白
Swift 中的 UICollectionView 自定义布局
UICollectionView 自定义布局(---照片浏览器)