UICollectionView oculta incorrectamente las celdas durante la transición de layout

Hay algunas preguntas sobre los errores de UICollectionView que ocultan las celdas, pero no creo que haya sido cubierto. La mayoría de las otras preguntas parecen estar relacionadas específicamente con UICollectionViewFlowLayout y las inserciones de sección, mientras que he visto este problema cuando se hace la transición entre layouts completamente personalizados.


Al realizar una transición de layout interactivo, UICollectionView parece estar ocultando celdas que no deberían ocultarse:

introduzca la descripción de la imagen aquí

(Observe que las celdas 40 y 45 en la parte inferior izquierda desaparecen durante la transición)

Parece que ocurre en un lugar específico: cada vez que los attributes de layout de la celda (devueltos desde el layoutAttributesForElementsInRect: del layout de transición tienen una ttwig con un minX menor que el pasado en rectXX Y un maxY mayor que el maxX de rect . En codigo:

 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray *layoutAttributes = [super layoutAttributesForElementsInRect:rect]; for (UICollectionViewLayoutAttributes *attr in layoutAttributes) { if (CGRectGetMinX(attr.frame) < CGRectGetMinX(rect) && CGRectGetMaxY(attr.frame) > CGRectGetMaxY(rect)) { NSLog("Element at index path %@ will disappear unexpectedly", attr.indexPath); } } return layoutAttributes; } 

El layout de transición devuelve los attributes de layout correctos, mostrando el centro de la celda moviéndose gradualmente fuera de la pantalla. Sin embargo, una vez que ha pasado el punto mencionado anteriormente, la vista de colección parece decidir que ya no es visible (¡es!) Y establece la propiedad hidden la celda en sí, ignorándola hasta que su cuadro se mueva más dentro de rect .

He creado un proyecto de ejemplo que demuestra este problema (la animation anterior es de esta muestra en acción). Utiliza dos layouts de flujo simples para simplificar, pero lo noté al trabajar en una transición entre subclasss UICollectionViewLayout personalizadas. La mayor parte del código simplemente gestiona la transición interactiva utilizando un reconocimiento de gesto de pellizco, y estoy seguro de que no hay nada notable allí.

El problema no parece ocurrir cuando se usan transiciones de layout animadas simples ( setCollectionViewLayout:animated: … intente ejecutar el proyecto de ejemplo con animaciones lentas y toque una celda: todas las celdas setCollectionViewLayout:animated: animadas como se esperaba.

Esto parece ser un error en la implementación de UICollectionView para mí, pero realmente lo agradecería si alguien sabe de una solución eficaz.


Actualizar:

Presento un informe de errores con Apple y, simultáneamente, abrí un Incidente de Soporte Técnico para ver si se puede encontrar una solución. Agregaré una respuesta si aprendo algo útil de los ingenieros.

Actualizar:

Apple DTS respondió para confirmar que se trata de un error y que no hay solución. Para mi caso, terminé simplemente forzando a las células desaparecidas a no alcanzar el umbral mágico que las hace desaparecer.