Je travaille sur un projet qui utilise une UICollectionView
pour afficher plusieurs albums. Les éléments montrent bien, mais maintenant je veux montrer un en-tête au-dessus de la première section.
Pour ce faire, j'ai ajouté le registerNib:forSupplementaryViewOfKind:withReuseIdentifier:
à ma méthode init. Comme ça:
[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];
(La variable AlbumHeader
contient une vue de la classe AlbumHeader
, qui est une sous-classe de UICollectionView
.)
Après cela, j'ai implémenté la méthode collectionView:viewForSupplementaryElementOfKind:atIndexPath
:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}
Maintenant, il devrait essayer de charger la vue d’en-tête, je suppose. Mais ce n'est pas le cas, la méthode de la vue supplémentaire n'est pas appelée.
Qu'est-ce que je rate? Coincé pendant des heures, j'ai lu la documentation sur UICollectionView
s à plusieurs reprises, mais rien ne semble l'aider. Des pensées?
Après avoir recherché la méthode sur laquelle vous avez posé la question, j'ai lu que par défaut, la taille des en-têtes/pieds de page était de 0,0. Si la taille est 0, l'en-tête/le pied de page ne s'affichera pas.
Vous pouvez définir la taille avec une propriété:
flowLayout.headerReferenceSize = CGSizeMake(0, 100);
Tous les en-têtes auront alors la même taille. S'il doit être différent pour chaque section, vous pouvez implémenter la méthode suivante, qui fait partie du protocole UICollectionViewDelegateFlowLayout
.
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
if (section == albumSection) {
return CGSizeMake(0, 100);
}
return CGSizeZero;
}
Notez qu'en défilement vertical, il utilise la valeur retournée height
et la largeur totale de la vue de collection. En défilement horizontal, il utilise la valeur retournée width
et la hauteur de la vue de collection.
Avez-vous mis en œuvre:
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
Il y a une tonne de méthodes à mettre en œuvre simplement pour faire fonctionner une chose ... j'apprends aussi. Dis-moi si ça marche.
Edit: Désolé, mauvaise méthode. C'est pour le sous-classement, je pense. Celui dont je parle est dans UICollectionViewLayout
(l'objet de présentation que vous sous-classe, si votre présentation prend en charge des vues supplémentaires):
- layoutAttributesForSupplementaryViewOfKind:atIndexPath:
pour 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
Vous devez ajouter ceci à ViewDidLoad , et notez le
layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
Cela rendra l'en-tête Section Layouts
et Merci @Guido Hendriks, et tout ce que j'ai aussi compris de leur réponse