下面的代码正确地显示了我的标题视图,但是对于UICollectionView中的每个部分:
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath {
UICollectionReusableView * headerView =
[collectionView
dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:@"SectionHeaderCollectionReusableView"
forIndexPath:indexPath];
switch (indexPath.section) {
case Section_One:
return headerView;
case Section_Two:
return headerView;
case Section_Three:
return headerView;
case Section_Four:
return headerView;
case Section_Five:
return headerView;
default:
return headerView;
}
}
我想做的是,而不是显示'Section_One'或'Section_Two'的标题视图,而是在'NSInternalInconsistencyException'中返回'nil'结果:
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath {
UICollectionReusableView * headerView =
[collectionView
dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:@"SectionHeaderCollectionReusableView"
forIndexPath:indexPath];
switch (indexPath.section) {
case Section_One:
return nil;
case Section_Two:
return nil;
case Section_Three:
return headerView;
case Section_Four:
return headerView;
case Section_Five:
return headerView;
default:
return nil;
}
}
我需要做什么才能仅为某些部分显示标题视图?
继续并为每个部分返回一个标题,然后在这个UICollectionViewDelegate函数中设置该部分标题的大小为0。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return CGSizeZero;
}else {
return CGSizeMake(self.collectionView.bounds.size.width, desiredHeight);
}
}
我有一个案例,一个UICollectionViewController
控制两个UICollectionView
s(后来引用为集合视图1和2),我想要头到第一个,没有头(或页脚)到第二个。
@mwright的回答中缺少的是,当您为集合视图2返回CGSizeZero
时,如下所示:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
if collectionView == self.collectionView2 {
return CGSizeZero
}
return < something else >
}
…表示collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView
对于集合视图2根本不调用。
意味着您不需要担心为第二个集合视图徒劳地返回一个"错误"的标题。
我注意到接受的答案打破当你在XIB中使用自动布局可重用的头。
如果你将内容与边缘隔开,或者给header视图内的项目一个静态的、不可变的大小,这尤其会破坏。将头大小设置为CGSizeZero会使我的调试器控制台混乱,来自Interface Builder的几十个警告说他们会打破所有的约束来满足委托方法中的需求集。
虽然这本身在技术上并不是一个灾难,但它仍然很脏。在Swift和自动布局的时代,必须有一个更简洁的解决方案。而且你绝对不想在工作的时候把这种东西交给客户。
为了解决这个问题,而不是仅仅调用referenceSizeForHeaderInSection:
并返回CGSizeZero
,我创建了UICollectionReusableView
的另一个子类,并将其内部视图的高度设置为0
。
然后,我在viewForSupplementaryElementOfKind
方法中包含的switch
语句之外对该变体进行了排队。这同时满足了Interface Builder 和的视觉需求!🎉
总比在调试时在控制台打印数百个不满意的约束警告要好。
如果返回大小为(0,0)的值,则不添加标题。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
switch section {
case 0:
return CGSize(width: collectionView.bounds.width, height: 70)
case 1:
return CGSize(width: 0, height: 0) // NO HEADER WILL BE ADDED
case 2:
return CGSize(width: collectionView.bounds.width, height: 70)
case 3:
return CGSize(width: 0, height: 0) // NO HEADER WILL BE ADDED
default:
return CGSize(width: collectionView.bounds.width, height: 70)
}
}
尝试返回一个空视图。可能是更好的方法,但这可以工作....