Подтвердить что ты не робот

Заголовок UICollectionView не отображается

Я работаю над проектом, который использует UICollectionView для отображения нескольких альбомов. Элементы отображаются отлично, но теперь я хочу показать заголовок над первым разделом.

Чтобы сделать это, я добавил метод registerNib:forSupplementaryViewOfKind:withReuseIdentifier: в мой метод init. Вот так:

[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];

(AlbumHeader Nib содержит представление класса AlbumHeader, которое является подклассом UICollectionView.)

После этого я применил метод collectionView:viewForSupplementaryElementOfKind:atIndexPath:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}

Теперь нужно попытаться загрузить представление заголовка, я полагаю. Но это не так, метод для дополнительного представления не вызван.

Что мне не хватает? Застрял часами, много раз читал документацию на UICollectionView, но ничего не помогает. Любые мысли?

4b9b3361

Ответ 1

После поиска метода yuf, о котором я спрашивал, я прочитал, что по умолчанию размер заголовков/нижних колонтитулов равен 0,0. Если размер равен 0, верхний/нижний колонтитул не будет отображаться.

Вы можете установить размер с помощью свойства:

flowLayout.headerReferenceSize = CGSizeMake(0, 100);

Тогда все заголовки будут иметь одинаковый размер. Если для каждого раздела он должен быть разным, вы можете реализовать следующий метод, который является частью протокола UICollectionViewDelegateFlowLayout.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    if (section == albumSection) {
        return CGSizeMake(0, 100);
    }

    return CGSizeZero;
}

Обратите внимание, что при вертикальной прокрутке используется возвращенная height и полная ширина представления коллекции, при горизонтальной прокрутке используется return width и полная высота представления коллекции.

Ответ 2

Вы реализовали:

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

Там тонна методов, которые нужно реализовать, чтобы заставить одну вещь работать... Я тоже учусь. Скажите, если это сработает.

Изменить: Извините неправильный метод. Я думаю, что для подкласса. Тот, о котором я говорю, находится в UICollectionViewLayout (объект макета, который вы используете для подкласса, если ваш макет поддерживает дополнительные виды):

- layoutAttributesForSupplementaryViewOfKind:atIndexPath:

Смотрите здесь: https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//apple_ref/occ/cl/UICollectionViewLayout

Ответ 3

для SWIFT 3 и SWIFT 4

    self.collectionView.register(UINib(nibName: "SectionCollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "SectionCollectionReusableView")



    self.collectionView.fs_width = self.collectionView.bounds.width

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 70, left: 40, bottom: 0, right: 0)
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    layout.estimatedItemSize = CGSize(width: 350, height: 140)
    layout.scrollDirection = .horizontal
    layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
    layout.sectionHeadersPinToVisibleBounds = true
    self.collectionView!.collectionViewLayout = layout

Вы должны добавить это в ViewDidLoad, и обратите внимание на

layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)

Это сделает заголовок раздела макетов

и спасибо @Ben & @yuf, я тоже понял их ответ