web-dev-qa-db-fra.com

modifier dynamiquement la hauteur d'un UICollectionReuseableView (en-tête de section de collection)

J'essaie de définir la hauteur des en-têtes de section pour un UICollectionView dynamiquement, mais en utilisant le code ci-dessous, je ne vois rien changer. La vue est dessinée avec les bons éléments mais la hauteur ne bougera pas. Désolé s'il s'agit d'une question répétée, mais je n'arrive pas à trouver quoi que ce soit lié spécifiquement à l'objet UICollectionView. Merci d'avance.

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
           viewForSupplementaryElementOfKind:(NSString *)kind
                                 atIndexPath:(NSIndexPath *)indexPath
{
    PhotoVideoHeaderCell *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                                                          withReuseIdentifier:@"videoHeaderView"
                                                                                 forIndexPath:indexPath];
    if (indexPath.section == 0) {
        // photos
        [headerView setSection:@"Photo"];
    } else {
        [headerView.VehicleDetailView removeFromSuperview];
        CGRect frame = headerView.frame;
        frame.size.height = 60;
        [headerView setFrame:frame];
        [headerView setNeedsDisplay];
        [headerView setBackgroundColor:[UIColor grayColor]];
        [headerView setSection:@"Video"];
    }

    return headerView;
}
29
DirtyKalb

Votre délégué doit implémenter la fonction suivante, en supposant que vous utilisez une disposition de flux:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;

Vous pouvez renvoyer une taille différente pour chaque en-tête. Dans les vues de collection à défilement horizontal, seule la largeur est utilisée. Dans ceux à défilement vertical, seule la hauteur est utilisée. La valeur inutilisée est ignorée - votre vue sera toujours étirée pour remplir respectivement la pleine hauteur/largeur des vues de collection horizontales/verticales.

Il existe également une méthode correspondante pour les pieds de page.

72
Ash Furrow

Réponse acceptée en Swift 3 et 4:

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

Eh bien, au lieu d'utiliser la méthode déléguée bruyante, je préfère utiliser ceci: (ne fonctionne que si vous avez une taille d'en-tête unique)

    let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout // Assuming you use the default flow layout 
    layout.headerReferenceSize = CGSize(width: 42, height: 42) //Set the header size

Fonctionne également avec l'élément

    layout.itemSize = CGSize(width: 42, height: 42) //Set a custom item size

Cela fonctionne très bien pour définir la taille d'un élément par rapport à la largeur de votre écran par exemple.

3
Antzi

Essayez quelque chose comme ceci:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    UICollectionReusableView *header = [siteMapCollection dequeueReusableSupplementaryViewOfKind: UICollectionElementKindSectionHeader withReuseIdentifier: @"headerID" forIndexPath: indexPath];
    NSString *headerText = @"This is my header";
    UIFont *labFont = [UIFont fontWithName: @"HelveticaNeue-CondensedBold" size: 20.0];
    CGSize textSize = [dummyText sizeWithFont: labFont];
    UILabel *headerLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, header.frame.size.height - (textSize.height + 12), header.frame.size.width, textSize.height + 8)];
    [headerLabel setFont: labFont];

    [header addSubview: headerLabel];

    return header;
}
1
Axeva