web-dev-qa-db-fra.com

L'en-tête UICollectionView ne s'affiche pas

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 UICollectionViews à plusieurs reprises, mais rien ne semble l'aider. Des pensées?

41
Guido Hendriks

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.

112
Guido Hendriks

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:

Voir ici: https://developer.Apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#// Apple_ref/occ/cl/UICollectionViewLayout

2
yuf

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