ios objective-c uitableview uicollectionview sectionheader

ios - UICollectionView con encabezados de sección como UITableView



objective-c sectionheader (2)

Tengo una pregunta rápida: ¿alguien ha sido capaz de crear e implementar exitosamente encabezados de sección en un CollectionView similar a los encabezados en un TableView? Investigué mucho y encontré fragmentos de código pero ningún ejemplo real de alguien que haya logrado esto con éxito. Tengo una CollectionView de fotos. Lo que intento lograr es agruparlas en secciones según el mes en que fueron tomadas. He logrado dividirlos en esas secciones, pero todo lo que tengo ahora es un encabezado en blanco justo encima del inicio de cada sección. Lo que quiero hacer es mostrar los meses en esos encabezados actualmente en blanco. De la misma manera, las letras de cada sección se muestran en la vista de tabla que muestra los contactos. Gracias por sus respuestas de antemano.


  1. Habilite la vista de encabezado / pie de página de sección en Storyboard.

  2. Implementar el método collectionView:viewForSupplementaryElementOfKind .

ver este enlace


Agregar encabezados de sección en una vista de colección funciona para mí con la siguiente configuración:

  1. agregue un archivo xib para definir el contenido de la vista del encabezado. El archivo xib contiene solo una definición de tipo de celda. En mi caso, la vista de encabezado tiene un tipo personalizado (ImageCollectionViewHeaderCell) que se deriva de UICollectionViewCell. Creo que es obligatorio, pero no estoy seguro. El identificador de celda también se establece en una cadena predefinida (por ejemplo) "ImageCollectionViewHeaderCellId"

  2. agregue los archivos de encabezado y de implementación para el tipo personalizado. Es conveniente tener un método para obtener su objeto UINib (un tipo de proxy para el archivo xib creado en el paso 1)

    @implementation ImageCollectionViewHeaderCell + (UINib*) nib { return [UINib nibWithNibName:@"nameOfXibFileCreatedAtStep1" bundle:nil]; } @end

  3. en el controlador de vista de colección (que, en mi caso, también es el origen de datos y el delegado de UICollectionView), en el método viewDidLoad, agregue el registro para el tipo de elemento suplementario

    - (void) viewDidLoad { [_collectionView registerNib:[ImageCollectionViewHeaderCell nib] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"ImageCollectionViewHeaderCellId"]; }

  4. en el controlador de vista de colección, agregue los métodos para devolver una altura de encabezado no nulo y las instancias de vista de encabezado

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { return CGSizeMake(0., 30.); } - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { NSAssert([kind isEqualToString:UICollectionElementKindSectionHeader], @"Unexpected supplementary element kind"); UICollectionReusableView* cell = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:ImageCollectionViewHeaderCellIdentifier forIndexPath:indexPath]; NSAssert([cell isKindOfClass:[ImageCollectionViewHeaderCell class]], @"Unexpected class for header cell"); ImageCollectionViewHeaderCell* header_view = (ImageCollectionViewHeaderCell*) cell; // custom content return cell; }