2012-10-03 18 views
39

Estoy trabajando en un proyecto que usa un UICollectionView para mostrar varios álbumes. Los elementos se muestran bien, pero ahora quiero mostrar un encabezado sobre la primera sección.El encabezado UICollectionView no muestra

Para hacer esto, agregué el registerNib:forSupplementaryViewOfKind:withReuseIdentifier: a mi método init. De esta manera:

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

(. El AlbumHeader plumilla contiene una vista de la clase AlbumHeader, que es una subclase de UICollectionView)

Después de eso, he implementado collectionView:viewForSupplementaryElementOfKind:atIndexPath método:

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

Ahora debería intentar cargar la vista de encabezado, supongo. Pero no es así, el método para la vista suplementaria no se llama.

¿Qué me estoy perdiendo? Atascado durante horas, ha leído la documentación en UICollectionView s muchas veces, pero nada parece ayudar. ¿Alguna idea?

Respuesta

106

Después de buscar el método YUF preguntó acerca, me lee que por defecto el tamaño de los encabezados/pies de página es 0,0. Si el tamaño es 0, el encabezado/pie de página no se mostrará.

Puede ajustar el tamaño con una propiedad:

flowLayout.headerReferenceSize = CGSizeMake(0, 100); 

A continuación, todas las cabeceras tendrán el mismo tamaño. Si tiene que ser diferente para cada sección, puede implementar el siguiente método, que es parte del protocolo UICollectionViewDelegateFlowLayout.

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

    return CGSizeZero; 
} 

Nótese que en vertical scrolling utiliza el height vuelto y la anchura completa de la vista colección, en horizontal de desplazamiento que utiliza el retorno width y la altura completa de la vista colección.

+4

Para cualquier persona que todavía tenga este problema, para que yo pueda hacer esto, también tuve que dar un tamaño a 'collectionview.footerReferenceSize'. No estoy seguro de si eso es específico de iOS 7 ... –

+1

Este es un consejo increíble. Gracias a un millón, Guido! – Fattie

+1

¡Disfruta esa recompensa! :) – Fattie

2

Did implementar:

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

Hay un montón de métodos para poner en práctica sólo para hacer una cosa de trabajo ... Estoy aprendiendo también. Dime si funciona

Editar: Lo siento método equivocado. Eso es para crear subclases, creo. El que estoy hablando es de UICollectionViewLayout (el objeto de diseño que subclase, si su diseño es compatible con vistas complementarias):

- layoutAttributesForSupplementaryViewOfKind:atIndexPath: 

Ver aquí: https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//apple_ref/occ/cl/UICollectionViewLayout

+0

¿Ese método no parece ser parte de ningún delegado? –

+0

@GuidoH usaste FlowLayout o tu diseño personalizado? Esta respuesta se refiere al diseño personalizado. – Juguang

+0

Utilicé el diseño de flujo. La respuesta aceptada lo resolvió todo, y tiene sentido también. =) –

Cuestiones relacionadas