UICollectionReusableView方法没有被调用

我想我的UICollectionView部分有一个图像的标题。

我已经按照这些步骤:

  • 在故事板上,为我的UICollectionView指定了一个头文件作为附件
  • 给了它一个标识符
  • 为它创build了一个UICollectionReusableView的子类
  • 将自定义类分配给故事板上的类。
  • 将一个ImageView放在标题附件中
  • .h文件的自定义类中为ImageView了一个出口
  • viewDidLoad实现以下viewDidLoad

 [self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier]; -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { ScheduleHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath]; headerView.headerImageView.image = [UIImage imageNamed:@"blah.png"]; reusableview = headerView; } return reusableview; } 

我知道数据源和委托方法正在工作,因为我可以看到所有的单元格和它的部分。 但是,我没有我的标题。 我在上面的方法中放置了一个断点,它永远不会被调用。

我究竟做错了什么?

看来你必须给你的头非零大小或collectionView:viewForSupplementaryElementOfKind:atIndexPath不被调用。 所以要么像这样设置stream布局的headerReferenceSize属性:

 flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f); 

或者,如果你想改变大小的部分,实现collectionView:layout:referenceSizeForHeaderInSection

你回答了这个问题,但用我的话来说,我更好地理解:

要调用该方法,请添加以下方法:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { return CGSizeMake(60.0f, 30.0f); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { return CGSizeMake(60.0f, 30.0f); } 

…从那里出发

Swift 3.0(xcode 8.2.1)

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { return CGSize(width:collectionView.frame.size.width, height:30.0) } 

有很快的版本:

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { let size = CGSize(width: 400, height: 50) return size } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { let size = CGSize(width: 400, height: 50) return size } 

XCode(版本7.3.1)不会在自动完成中提出这些方法!

如果你只是想要一个头,只要保持头的方法。

Swift 4 Xcode 9.1 Beta 2

添加@objc

 @objc func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{ let size = CGSize(width: 400, height: 50) return size } 

现金: https : //medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd

你在当前界面添加了UICollectionViewDelegateFlowLayout吗? 这对我有效。

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

我的问题是,在迅速3,viewForSupplementaryElementOfKind函数的名称已经从堆栈溢出的任何post略有改变。 因此,它从来没有被召唤。 请确保,如果你在swift 3,你是委托函数匹配:

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