如果部分标题隐藏在UICollectionView中,则删除空白空间

我在UICollectionView有两个部分。 我只想在UICollectionView显示节标题。 不在第0节。

所以我试图返回nil viewForSupplementaryElementOfKindsection == 0方法,并返回section == 1视图。

它崩溃,并显示下面的错误:

 Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes]: 

这里是我的补充视图的代码。

 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *sectionHeader = nil; if (kind == UICollectionElementKindSectionHeader && indexPath.section == 1) { sectionHeader = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"EventSectionHeader" forIndexPath:indexPath]; sectionHeader.layer.borderWidth = .5f; sectionHeader.layer.borderColor = [UIColor colorWithRed:221.0 / 255.0 green:223.0 / 255.0 blue:220.0 / 255.0 alpha:1.0].CGColor; } return sectionHeader; } 

我发现返回nil viewForSupplementaryElementOfKind:方法也崩溃了。 其他答案build议删除该方法。

但是我只想为特定的部分显示部分标题。 如何实现只有一个部分的返回视图? 谢谢。 任何帮助,将不胜感激。

编辑:

正如@san所说,我已经更新了代码来隐藏部分标题。 有用。 它隐藏了标题。 但是,我仍然看到部分标题处的空白处。 预期的结果是不应该有段标题的空间,如果是隐藏的。

更新的代码:

 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *sectionHeader = nil; if (kind == UICollectionElementKindSectionHeader) { sectionHeader = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"EventSectionHeader" forIndexPath:indexPath]; sectionHeader.layer.borderWidth = .5f; sectionHeader.layer.borderColor = [UIColor colorWithRed:221.0 / 255.0 green:223.0 / 255.0 blue:220.0 / 255.0 alpha:1.0].CGColor; if (indexPath.section == 0) { sectionHeader.hidden = YES; }else { sectionHeader.hidden = NO; } } return sectionHeader; } 

我甚至试图设置frameHeader的框架@san说。 但没有运气。 同样的结果。

最后,我find了我的问题的答案。 我错过了一些东西。 无论如何,对于其他用户感到抱歉。

@san说,我在下面的方法里面设置了标题的高度和宽度。

 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 

但是,设置补充视图的帧大小不是正确的方法。 后来我在flowLayout里面find了另外一个方法,它可以帮助我设置页眉和页脚的大小。

这真的适合我:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { if (section == 0) { return CGSizeZero; }else { return CGSizeMake(CGRectGetWidth(collectionView.bounds), 135); } } 

更新:由于有人质疑我的技能在评论中,附上苹果文件链接返回CGSizeZero上面的方法。

collectionView:viewForSupplementaryElementOfKind:atIndexPath:的文档collectionView:viewForSupplementaryElementOfKind:atIndexPath: states:

这个方法必须总是返回一个有效的视图对象。 如果您不想在特定情况下使用补充视图,则布局对象不应该为该视图创build属性。 或者,您可以通过将相应属性的隐藏属性设置为YES来隐藏视图,或者将属性的alpha属性设置为0.要隐藏stream布局中的页眉和页脚视图,还可以设置这些视图的宽度和高度为0。

考虑到你已经尝试设置高度为零,并设置视图隐藏,你应该UICollectionViewFlowLayout并实现layoutAttributesForSupplementaryViewOfKind:atIndexPath:

检查indexPath(就像你已经做的那样),如果你不需要该特定补充视图的布局属性,则返回nil

 - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { if([indexPath section] == 0) { return nil; } return [super layoutAttributesForSupplementaryViewOfKind:kind atIndexPath:indexPath]; } 

文件清楚地说 –

返回值

configuration的补充视图对象。 你不能从这个方法返回零。

所以你需要遵循 –

这个方法必须总是返回一个有效的视图对象。 如果您不想在特定情况下使用补充视图,则布局对象不应该为该视图创build属性。 或者,您可以通过将相应属性的隐藏属性设置为YES来隐藏视图,或者将属性的alpha属性设置为0.要隐藏stream布局中的页眉和页脚视图,还可以设置这些视图的宽度和高度为0。

来到你的代码,下面的代码段应该为你工作:

 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *sectionHeader = nil; if (kind == UICollectionElementKindSectionHeader) { sectionHeader = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"EventSectionHeader" forIndexPath:indexPath]; if(indexPath.section == 1) { sectionHeader.layer.borderWidth = .5f; sectionHeader.layer.borderColor = [UIColor colorWithRed:221.0 / 255.0 green:223.0 / 255.0 blue:220.0 / 255.0 alpha:1.0].CGColor; } else { sectionHeader.frame = CGRectZero; sectionHeader.hidden = YES; } } return sectionHeader; } 

您可以通过添加UICollectionViewDelegateFlowLayout委托并使用下面的代码来隐藏/显示可重用的标题部分

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{ if (self.isForSearch) { //---> for hiding return CGSizeMake(0,0); } else{//---> for showing return ((UICollectionViewFlowLayout*)self.collectionChoosePlanView.collectionViewLayout).headerReferenceSize; } } 

所以你可以隐藏/显示它