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 UICollectionViewIsso acontece muitas vezes, mas nada parece ajudar.Alguma ideia?

Foi útil?

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:

Veja aqui: https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//apple_ref/occ/cl/UICollectionViewLayout

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top