dynamiczna zmiana wysokości UICollectionReuseableView (nagłówka sekcji kolekcji)

Próbuję dynamicznie ustawić wysokość nagłówków sekcji dla UICollectionView, ale używając poniższego kodu, nie widzę żadnych zmian. Widok jest rysowany z odpowiednimi elementami w nim, ale wysokość nie drgnie. Przepraszam, jeśli to jest pytanie powtarzające się, ale nie mogę znaleźć niczego związanego konkretnie z obiektem UICollectionView. Z góry dzięki.

- (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;
}
Author: trudyscousin, 2013-01-17

4 answers

Twój delegat powinien zaimplementować następującą funkcję, zakładając, że używasz układu przepływu:

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

Możesz zwrócić inny rozmiar dla każdego nagłówka. W poziomo przewijanych widokach kolekcji używana jest tylko szerokość. W przewijaniu pionowym używana jest tylko wysokość. Nieużywana wartość jest ignorowana - widok będzie zawsze rozciągnięty, aby wypełnić pełną wysokość/szerokość poziomych/pionowych widoków kolekcji.

Istnieje odpowiednia metoda dla stopek, też.

 68
Author: Ash Furrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 17:27:29

Zaakceptowana 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)
}
 2
Author: brandonscript,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 20:28:11

Spróbuj 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
Author: Axeva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 17:16:43

Cóż, zamiast używać metody noisy delegate, wolę używać tego: (działa tylko, jeśli masz unikalny rozmiar nagłówka)

    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

Działa również z itemSize:

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

To działa świetnie do Ustawienia rozmiaru elementu w stosunku do szerokości ekranu dla exemple.

 1
Author: Antzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-05 07:51:52