在集合视图中使用自定义流布局时添加标题

Posted

技术标签:

【中文标题】在集合视图中使用自定义流布局时添加标题【英文标题】:Add Header When Using a Custom Flow Layout in a Collection View 【发布时间】:2017-06-28 17:26:53 【问题描述】:

向集合视图添加自定义流布局时,附件选项消失了,为什么?,我使用 this 流布局将我的集合视图的元素居中,但由于无法使用情节提要向我的集合视图添加部分标题,为集合视图添加标题的步骤是什么?

我尝试的是:

由于我的自定义布局是 UICollectionViewFlowLayout 的子类,因此在情节提要编辑器中,我选择了左侧对象列表中的布局(黄色立方体)。然后在 Identity Inspector 中,我选择了自定义布局的类。

collection view 似乎为 header 创建了空间,但里面没有显示任何内容,即使我只为可重用视图提供另一种背景颜色,它也不会显示任何内容。

【问题讨论】:

【参考方案1】:

经过一番研究,我找到了我想要的东西:

我必须在单独的 xib 中创建我的标题,所以这就是我所做的:

    使用 xib 文件创建了 UICollectionReusableView 子类 使用 xib 文件创建了 UICollectionViewCell 子类 添加了我的 ui 元素(我需要在标题处设置一个水平集合,因此在这种情况下也需要单独创建和设计单元格)。 在我的主集合视图的视图控制器中,需要注册可重用视图的 nib 和可重用单元格的 nib,如下所示:

Swift 3.2

override func viewDidLoad() 
    ...

    let headerNib = UINib(nibName: "HeaderCollectionReusableView", bundle: nil)
    collection.register(headerNib, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header")

    注册笔尖后,您可以使用此代码在viewForSupplementaryElementOfKind 方法中添加标题

Swift 3.2

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

    switch kind 
    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath)
        return headerView

    default://I only needed a header so if not header I return an empty view
        return UICollectionReusableView()
    

【讨论】:

【参考方案2】:

在 Objective-C 中

在viewDidLoad中调用registerCell方法

- (void)registerCell 

    UINib *cellNibTitle  = [UINib nibWithNibName:@"YOUR_HEADER_CELL" bundle:nil];
    [self.collection registerNib:cellNibTitle forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header"];
    

并调用委托方法:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
    
    if(kind == UICollectionElementKindSectionHeader)
        YOUR_HEADER_CELL *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"Header" forIndexPath:indexPath];
        return headerView;
    
    
    return  [UICollectionReusableView new];


【讨论】:

以上是关于在集合视图中使用自定义流布局时添加标题的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 实现自定义集合视图布局

UICollectionView:使用动画和自定义布局调整单元格大小

如何在 iOS 中避免/禁用 Collection View 的垂直滚动

在 ios 8 中将集合或表格视图或自定义视图添加到滚动视图

UICollectionView 自定义布局页脚视图不粘在集合视图的底部

使用自动布局自定义集合视图单元格的动态高度