2013-01-17 4 views
26

Ich versuche, die Höhe der Abschnitt Header für eine UICollectionView dynamisch, aber mit dem Code unten, sehe ich nichts zu ändern. Die Ansicht ist mit den richtigen Elementen darin gezeichnet, aber die Höhe wird nicht nachgeben. Entschuldigung, wenn das eine wiederholte Frage ist, aber ich kann anscheinend nichts finden, das spezifisch mit dem UICollectionView Gegenstand zusammenhängt. Danke im Voraus.Ändern Sie die Höhe einer UICollectionReuseableView (Sammlungsabschnitt Header) dynamisch

- (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; 
} 

Antwort

64

Ihre Delegierten sollte die folgende Funktion implementieren, Sie verwenden ein Fluss Layout vorausgesetzt:

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

Sie können eine andere Größe zurück für jeder Header. In horizontal rollenden Auflistungsansichten wird nur die Breite verwendet. Bei vertikal scrollenden Bildern wird nur die Höhe verwendet. Der nicht verwendete Wert wird ignoriert. Ihre Ansicht wird immer gestreckt, um die gesamte Höhe/Breite der horizontalen/vertikalen Sammlungsansichten zu füllen.

Auch für Fußzeilen gibt es eine entsprechende Methode.

+1

dies funktioniert, aber wie kann ich feststellen, welcher Abschnitt i Bearbeitung bin ich es bei Index 1 – DirtyKalb

+0

Verwenden Abschnitt nur tun wollen, dass die 'section' Parameter in der Methode. Speichern Sie den Abschnitt, den Sie gerade bearbeiten, und vergleichen Sie sie. Wenn sie nicht identisch sind, geben Sie 'headerReferenceSize' des Layouts zurück. –

+0

Es tut uns leid, hier ein komplettes noob zu sein, aber die headerReferenceSize ist nicht Teil des collectionViewLayout ... Muss ich eine Instanz des Headers erstellen, um den Frame zu lesen? – DirtyKalb

1

versuchen, etwas wie folgt aus:

- (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

akzeptierte Antwort in Swift 3 und 4:

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