ios objective-c animation uicollectionview uicollectionviewlayout

ios - layoutAttributesForSupplementaryViewOfKind: atIndexPath: pasa en indexPath incorrecto



objective-c animation (0)

Tengo un UICollectionViewLayout personalizado que usa vistas suplementarias para colocar un pie de página en la parte inferior de cada página.

Esto parece haber funcionado bien hasta que comencé a insertar celdas en la parte inferior de la página.

Como las vistas suplementarias deben vincularse a un NSIndexPath dentro de UICollectionView, en mi método de diseño de preparación detecto la última celda de la página y los layoutAttributes para la vista suplementaria se almacenan en el último indexPath en la página.

Este es el diseño de la vista de colección antes de insertar una nueva celda:

|- Page 1 |-- [0, 0] |-- [0, 1] |-- [0, 2] |- Footer (indexPath [0, 2]) |- Page 2 |-- [1, 0] |-- [1, 1] |- Footer (indexPath [1, 1])

Como era de esperar, mi método prepareLayout crea y almacena UICollectionViewLayoutAttributes para indexPaths [0, 2] y [1, 1] .
layoutAttributesForSupplementaryViewOfKind:atIndexPath: método también se llama dos veces para devolver los atributos correctos para indexPaths ( [0, 2] y [1, 1] )

El problema ahora es que cuando inserto una nueva celda en el índice [1, 2] el método prepareLayout correctamente los diseños y cambia el índice de acceso del segundo pie de página a [1, 2] como era de esperar.

Sin embargo, cuando layoutAttributesForSupplementaryViewOfKind:atIndexPath: se llama de nuevo para actualizar la interfaz, su propiedad indexPath sigue indexPath [1, 1] . Esto luego devuelve nil en el método, ya que no existe y causa un bloqueo (obviamente)!

¿Por qué layoutAttributesForSupplementaryViewOfKind:atIndexPath: aún devuelve el indexPath incorrecto (antiguo)? He comprobado que el diseño está siendo invalidado y que mi diccionario footerAttributes que está almacenando el layoutAttributes tiene el indexPath correcto (nuevo) así que por lo que he leído esto debería funcionar.

También es importante tener en cuenta que esto solo ocurre cuando se lleva a cabo una inserción animada ... Simplemente llamando a reloadData no falla.

Además, no puedo vincular la vista suplementaria a una sola sección, ya que mi diseño personalizado está diseñado para colocar en la página la colecciónView y las secciones pueden desbordarse en diferentes páginas, lo que significa múltiples vistas suplementarias para cada sección.

Aquí está una esencia del archivo .m de mi diseño: https://gist.github.com/liamnichols/6621694

o puede encontrar el repositorio aquí: https://github.com/liamnichols/LNCollectionViewPagedLayout/tree/master/Source

Mi solución alternativa sería asignar las vistas suplementarias a un NSIndexPath personalizado donde el valor de indexPath.row determinaría en qué página está la vista suplementaria, pero no estoy seguro de si esta es una forma adecuada de manejar esto, así que pensé que pediría consejo antes de la mano.

Cualquier ayuda sería genial,

Gracias.