¿Cómo puedo configurar la vista del encabezado completo en UICollectionView?

Quiero establecer el encabezado en la vista de colección, como lo hace el setTableHeader de UITableViewController.

Encontré la forma de establecer el encabezado de cada sección en la vista de colección, pero no pude encontrar cómo configurar la vista del encabezado de todo el encabezado.

La reference de Apple de UICollectionViewLayout dice: "Las vistas complementarias presentan datos pero son diferentes a las celdas. A diferencia de las celdas, el usuario no puede seleccionar vistas adicionales, sino que usa vistas complementarias para implementar cosas como vistas de encabezado y pie de página para una sección determinada o para todo vista de colección. Las vistas complementarias son opcionales y su uso y location están definidos por el object de layout. ", pero no sé cómo implementar la vista de encabezado para toda la vista de colección.

Traté de implementar esto haciendo un rectángulo de vista de encabezado de sección solo a la primera sección, pero fue diferente con tableHeader.

En la vista de tabla, si configuro el desplazamiento de contenido en el encabezado inferior, el tamaño de contenido se expande automáticamente para que el encabezado esté oculto, aunque existen algunos elementos.

Pero en la vista de colección, modificar la compensación de contenido solo funciona bien cuando existen muchos elementos suficientes para hacer un desplazamiento.

Traté de expandir dinámicamente el tamaño de contenido cuando existen algunos elementos, pero parece que no funciona bien …

Implementé esto usando un layout personalizado y reposicionando el encabezado en cada evento de desplazamiento. Comienza con la subsorting UICollectionViewLayout, hay toneladas de tutoriales en la web, esta es una buena: http://markpospesel.wordpress.com/2012/10/25/fixing-circlelayout/

Entonces, el truco consiste en devolver YES siempre a shouldInvalidateLayoutForBoundsChange: y al prepareLayout position de reposition (es decir, cambiar el cuadro de disposition de attributes) el encabezado basado en la vista de colección xOffset y yOffset.

Use una vista suplementaria con NSIndexPath 0-0.

layoutAttributesForElementsInRect: se llamará a cada marco, por lo que si tiene muchos elementos en la vista de la colección, deberá almacenar en caching el resultado para que no afecte el performance. Todos los attributes deben estar intactos a exception de ese único encabezado.

Fuente: Pasé 1 mes trabajando en este tema en particular.