I have two sections in UICollectionView
. I want to show a section header in UICollectionView
for only 1st section. Not in 0th section.
So I tried to return nil
in viewForSupplementaryElementOfKind
: method for section == 0
and returns view for the section == 1
.
It crashes and shows below error:
Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes]:
Here it is my code for the supplementary view.
- (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; }
I have found that returning nil in viewForSupplementaryElementOfKind:
method crashing for others too. Other answers suggesting to remove that method.
But I want to show section header for specific sections only. How to achieve that returning view for only one section? Thanks. Any help would be appreciated.
EDIT:
As @san said, I have updated code to hide the section header. It works. It hides the header. But I am still seeing the empty space in the place of section header. Expected results is there should be no space for section header, if it is hidden.
updated code:
- (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; }
I even tried setting the frame for sectionHeader as @san said. But no luck. same result.
At last, I found an answer for my question. I have missed something. Anyway sorry for other fellow users.
I set the header height and width inside the below method till now as @san said.
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
But It is not the correct method to set the frame size of supplementary views. Later I found another method inside the flowLayout, which helps me to set the header and footer sizes.
This really works well for me:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { if (section == 0) { return CGSizeZero; }else { return CGSizeMake(CGRectGetWidth(collectionView.bounds), 135); } }
UPDATE: Since someone questioned about my skill in comments, attaching Apple Documentation link for returning CGSizeZero in above method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With