如果部分标题隐藏在UICollectionView中,则删除空白空间
我在UICollectionView
有两个部分。 我只想在UICollectionView
显示节标题。 不在第0节。
所以我试图返回nil
viewForSupplementaryElementOfKind
: section == 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; } }
所以你可以隐藏/显示它