92 votes

La méthode UICollectionReusableView n'est pas appelée

Je veux que mes sections dans le UICollectionView pour avoir un en-tête avec une image.

J'ai suivi ces étapes :

  • au storyboard, a assigné un en-tête comme accessoire pour mon UICollectionView
  • lui a donné un identifiant
  • a créé une sous-classe de UICollectionReusableView pour elle
  • a assigné la classe personnalisée à la classe du storyboard.
  • mettre un ImageView à l'accessoire d'en-tête
  • a fait un débouché pour le ImageView à la classe personnalisée dans le .h fichier
  • A mis en œuvre ce qui suit à viewDidLoad :

    [self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier];

    -(UICollectionReusableView )collectionView:(UICollectionView )collectionView viewForSupplementaryElementOfKind:(NSString )kind atIndexPath:(NSIndexPath )indexPath { UICollectionReusableView *reusableview = nil;

    if (kind == UICollectionElementKindSectionHeader)
    {
        ScheduleHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath];
    
        headerView.headerImageView.image = [UIImage imageNamed:@"blah.png"];
    
        reusableview = headerView;
    }
    
    return reusableview;

    }

Je sais que les méthodes datasource et delegate fonctionnent car je peux voir toutes les cellules et leurs sections. Cependant, je n'ai pas mes en-têtes. J'ai placé un point d'arrêt à la méthode ci-dessus et elle n'est jamais appelée.

Qu'est-ce que je fais mal ?

222voto

rdelmar Points 53270

Il semble que vous devez donner à votre en-tête une taille non nulle ou collectionView:viewForSupplementaryElementOfKind:atIndexPath n'est pas appelé. Donc, soit vous définissez l'option headerReferenceSize de l'agencement du flux comme suit :

flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);

Swift 5+.

flowLayout.headerReferenceSize = CGSize(CGSize(width: self.collectionView.frame.size.width, height: 100))

ou, mettre en œuvre collectionView:layout:referenceSizeForHeaderInSection si vous voulez faire varier la taille par section.

36voto

Pear Johan Points 41

Vous avez répondu à la question, mais avec des mots que je comprends mieux :

Pour que la méthode soit appelée, ajoutez ces méthodes :

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    return CGSizeMake(60.0f, 30.0f);
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    return CGSizeMake(60.0f, 30.0f);
}

...et partir de là.

32voto

cwilliamsz Points 414

Swift 4 Xcode 9.1 Beta 2

Ajouter @objc

@objc func collectionView(_ collectionView: UICollectionView, layout  collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{
    let size = CGSize(width: 400, height: 50)
    return size
}

Crédits : https://medium.com/@zonble/votre-méthode-de-délégation-pourrait-ne-pas-être-appelée-en-swift-3-c6065ed7b4cd

21voto

CheshireKat Points 333

Avez-vous ajouté UICollectionViewDelegateFlowLayout dans l'interface actuelle ? Cela a fonctionné pour moi.

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

Swift :

class MyViewController: UICollectionViewDelegateFlowLayout {

9voto

Xeieshan Points 986

Swift 3.0 (xcode 8.2.1)

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width:collectionView.frame.size.width, height:30.0)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X