使用iOS UICollectionView只允许特定部分的头视图



下面的代码正确地显示了我的标题视图,但是对于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)
 }
}
 

尝试返回一个空视图。可能是更好的方法,但这可以工作....

相关内容

  • 没有找到相关文章

最新更新