Вопрос

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

Для этого я добавил registerNib:forSupplementaryViewOfKind:withReuseIdentifier: к моему методу инициализации.Так:

[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много раз, но ничего не помогает.Есть предположения?

Это было полезно?

Решение

После поиска метода, о котором спрашивал Юф, я прочитал, что по умолчанию размер верхних/нижних колонтитулов равен 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 и полную ширину представления коллекции, при горизонтальной прокрутке используется возврат width и полная высота представления коллекции.

Другие советы

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

- (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 и СВИФТ 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

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

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

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

и спасибо @Guido Hendriks, и все, что я также понял из их ответа

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top