Cabeçalho UICollectionView não exibido
-
12-12-2019 - |
Pergunta
Estou trabalhando em um projeto que usa um UICollectionView
para mostrar vários álbuns.Os itens aparecem bem, mas agora quero mostrar um cabeçalho acima da primeira seção.
Para fazer isso, adicionei o registerNib:forSupplementaryViewOfKind:withReuseIdentifier:
ao meu método init.Assim:
[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];
(O AlbumHeader
Nib contém uma visão da classe AlbumHeader
, que é uma subclasse de UICollectionView
.)
Depois disso, implementei collectionView:viewForSupplementaryElementOfKind:atIndexPath
método:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}
Agora deve tentar carregar a visualização do cabeçalho, suponho.Mas isso não acontece, o método para a visão suplementar não é chamado.
o que estou perdendo?Preso por horas, li a documentação em UICollectionView
Isso acontece muitas vezes, mas nada parece ajudar.Alguma ideia?
Solução
Depois de procurar o método sobre o qual yuf perguntou, li que por padrão o tamanho dos cabeçalhos/rodapés é 0,0.Se o tamanho for 0, o cabeçalho/rodapé não será exibido.
Você pode definir o tamanho com uma propriedade:
flowLayout.headerReferenceSize = CGSizeMake(0, 100);
Então todos os cabeçalhos terão o mesmo tamanho.Se tiver que ser diferente para cada seção, você pode implementar o seguinte método, que faz parte do UICollectionViewDelegateFlowLayout
protocolo.
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
if (section == albumSection) {
return CGSizeMake(0, 100);
}
return CGSizeZero;
}
Observe que na rolagem vertical ele usa o retornado height
e a largura total da visualização da coleção, na rolagem horizontal utiliza o retorno width
e a altura total da visualização da coleção.
Outras dicas
Você implementou:
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
Existem vários métodos para implementar apenas para fazer uma coisa funcionar... Também estou aprendendo.Diga-me se funciona.
Editar:Desculpe método errado.Isso é para subclasse, eu acho.Aquele de que estou falando está em UICollectionViewLayout
(o objeto de layout que você subclassifica, se seu layout suportar visualizações complementares):
- layoutAttributesForSupplementaryViewOfKind:atIndexPath:
para SWIFT 3 e 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
Você tem que adicionar isso a VerDidLoad, e observe o
layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
Isso fará com que os layouts da seção do cabeçalho
e obrigado @Guido Hendriks, e tudo o que obtive da resposta deles também