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

时间:2017-06-28 17:26:53

标签: ios swift uicollectionview

将自定义流程布局添加到集合视图时,附件选项会消失,为什么?,我使用this流程布局来集中我的集合视图的元素,但是因为没有使用故事板将部分标题添加到我的集合视图的方法,为集合视图添加标题的步骤是什么?

我尝试的是:

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

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

2 个答案:

答案 0 :(得分:2)

经过一些研究后,我发现了我在寻找的东西:

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

  1. 使用xib文件
  2. 创建了一个UICollectionReusableView子类
  3. 使用xib文件
  4. 创建了一个UICollectionViewCell子类
  5. 添加了我的ui元素(我需要在标题处添加一个水平集合,所以在这种情况下,需要单独创建和设计单元格。)
  6. 在我的主集合视图的视图控制器中,需要注册可重用视图的笔尖,以及可重用单元的笔尖,如下所示:
  7. Swift 3.2

    override func viewDidLoad() {
        ...
    
        let headerNib = UINib(nibName: "HeaderCollectionReusableView", bundle: nil)
        collection.register(headerNib, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header")
    }
    
    1. 注册笔尖后,您可以使用此代码在viewForSupplementaryElementOfKind方法
    2. 添加标题

      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()
          }
      }
      

答案 1 :(得分:0)

在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];

}