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 {}