Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView header not showing

I'm working on a project that uses an UICollectionView to show several albums. The items show fine, but now I want to show an header above the first section.

To do this, I added the registerNib:forSupplementaryViewOfKind:withReuseIdentifier: to my init method. Like this:

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

(The AlbumHeader Nib contains a view of the class AlbumHeader, which is a subclass of UICollectionView.)

After that, I implemented collectionView:viewForSupplementaryElementOfKind:atIndexPath method:

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

Now it should try to load the header view, I suppose. But it doesn't, the method for the supplementary view doesn't get called.

What am I missing? Stuck for hours, have read the documentation on UICollectionViews many times, but nothing seems to help. Any thoughts?

like image 503
Guido Hendriks Avatar asked Oct 03 '12 00:10

Guido Hendriks


3 Answers

After looking for the method yuf asked about, I read that by default the size of headers/footers are 0,0. If the size is 0, the header/footer won't display.

You can set the size with a property:

flowLayout.headerReferenceSize = CGSizeMake(0, 100);

Then all the headers will have the same size. If it has to be different for each section, you can implement the following method, which is part of the UICollectionViewDelegateFlowLayout protocol.

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

    return CGSizeZero;
}

Note that in vertical scrolling it uses the returned height and the full width of the collection view, in horizontal scrolling it uses the return width and the full height of the collection view.

like image 145
Guido Hendriks Avatar answered Nov 07 '22 23:11

Guido Hendriks


Did you implement:

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

There's a ton of methods to implement just to make one thing work...I'm learning too. Tell me if it works.

Edit: Sorry wrong method. That is for subclassing I think. The one I'm talking about is in UICollectionViewLayout (the layout object you subclass, if your layout supports supplementary views):

- layoutAttributesForSupplementaryViewOfKind:atIndexPath:

See here: https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//apple_ref/occ/cl/UICollectionViewLayout

like image 37
yuf Avatar answered Nov 07 '22 22:11

yuf


for 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

You have to add this to ViewDidLoad, and notice the

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

This will make the header Section Layouts

and Thanks @Guido Hendriks, and all I have got the insight from their answer as well

like image 3
Rakshitha Muranga Rodrigo Avatar answered Nov 07 '22 22:11

Rakshitha Muranga Rodrigo