Заголовок UICollectionView не отображается
-
12-12-2019 - |
Вопрос
Я работаю над проектом, который использует 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:
для СВИФТ 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, и все, что я также понял из их ответа