2013-01-17 6 views
26

Próbuję dynamicznie ustawić wysokość nagłówków sekcji dla UICollectionView, ale używając poniższego kodu, nic nie zmieniam. Widok jest narysowany prawidłowymi elementami, ale wysokość nie zmieni się. Przepraszam, jeśli to jest pytanie powtórzone, ale nie mogę znaleźć niczego związanego konkretnie z obiektem UICollectionView. Z góry dziękuję.dynamicznie zmieniać wysokość UICollectionReuseableView (nagłówek sekcji kolekcji)

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

Odpowiedz

64

Twój delegat powinien realizować następujące funkcje, przy założeniu, że używasz układ przepływu:

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

Można powrócić do innego rozmiaru każdy nagłówek. W przypadku przewijania widoków w poziomie używana jest tylko szerokość. W przypadku przewijania w pionie używana jest tylko wysokość. Niewykorzystana wartość jest ignorowana - widok będzie zawsze rozciągnięty, aby wypełnić odpowiednio pełną wysokość/szerokość widoków kolekcji poziomej/pionowej.

Istnieje odpowiednia metoda dla stopek.

+1

to działa, ale jak mogę powiedzieć, która część jestem edycji, chcę tylko robić to dla odcinka o indeksie 1 – DirtyKalb

+0

Skorzystaj z Sekcją parametru ' w metodzie. Zapisz sekcję, którą edytujesz w ivar, a następnie porównaj. Jeśli nie są takie same, zwróć "headerReferenceSize" układu. –

+0

przepraszam za bycie kompletnym noobem, ale nagłówekReferenceSize nie jest częścią kolekcjiViewLayout ... czy muszę utworzyć instancję nagłówka, aby odczytać ramkę? – DirtyKalb

1

spróbować czegoś takiego:

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

Akceptowane odpowiedź w Swift 3 i 4:

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