UICollectionView标头未显示

时间:2012-10-03 00:40:46

标签: objective-c cocoa-touch uicollectionview

我正在开发一个使用UICollectionView来展示多个相册的项目。项目显示正常,但现在我想在第一部分上方显示一个标题。

为此,我将registerNib:forSupplementaryViewOfKind:withReuseIdentifier:添加到我的init方法中。像这样:

[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];

AlbumHeader Nib包含类AlbumHeader的视图,它是UICollectionView的子类。)

之后,我实施了collectionView:viewForSupplementaryElementOfKind:atIndexPath方法:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}

现在它应该尝试加载标题视图,我想。但事实并非如此,补充视图的方法不会被调用。

我错过了什么?坚持了几个小时,已多次阅读UICollectionView上的文档,但似乎没有任何帮助。有什么想法吗?

3 个答案:

答案 0 :(得分:114)

在查找yuf询问的方法之后,我读到默认情况下页眉/页脚的大小是0,0。如果大小为0,则不会显示页眉/页脚。

您可以使用属性设置大小:

flowLayout.headerReferenceSize = CGSizeMake(0, 100);

然后所有标题都具有相同的大小。如果每个部分必须不同,则可以实现以下方法,该方法是UICollectionViewDelegateFlowLayout协议的一部分。

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    if (section == albumSection) {
        return CGSizeMake(0, 100);
    }

    return CGSizeZero;
}

请注意,在垂直滚动中,它使用返回的height和集合视图的整个宽度,在水平滚动时,它使用返回width和集合视图的完整高度。

答案 1 :(得分:2)

您是否实施了:

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

有很多方法可以实现,只是让一件事工作......我也在学习。告诉我它是否有效。

编辑:抱歉错误的方法。那是我认为的子类化。我正在谈论的那个是在UICollectionViewLayout中(如果您的布局支持补充视图,则为子类的布局对象):

- layoutAttributesForSupplementaryViewOfKind:atIndexPath:

见这里:https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//apple_ref/occ/cl/UICollectionViewLayout

答案 2 :(得分:0)

用于 SWIFT 3和SWIFT 4

    self.collectionView.register(UINib(nibName: "SectionCollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "SectionCollectionReusableView")



    self.collectionView.fs_width = self.collectionView.bounds.width

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 70, left: 40, bottom: 0, right: 0)
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    layout.estimatedItemSize = CGSize(width: 350, height: 140)
    layout.scrollDirection = .horizontal
    layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
    layout.sectionHeadersPinToVisibleBounds = true
    self.collectionView!.collectionViewLayout = layout

您必须将其添加到 ViewDidLoad ,并注意

layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)

这将使标题成为版面布局

感谢@Guido Hendriks,我也从他们的回答中得到了见识