uicollectionviewcontroller objective-c ios ipad uicollectionview

objective c - uicollectionviewcontroller - La decoración de UICollectionView y las vistas suplementarias no se pueden mover



uicollectionviewcell indexpath (5)

Tuve el mismo problema. parece que hay algunos errores con UICOllectionview (este no es el primero que vi). Lo arreglé al no usar "performBatchUpdates". Perdí la animación, pero en la lista no hay una vista no deseada.

En UICollectionView decoración y las vistas suplementarias parecen ser un gran misterio. Parece que no hay ningún código de ejemplo en este momento. Conseguí que ambos tipos trabajaran en un diseño personalizado (consulte esta publicación para obtener más información). Siempre y cuando permanezcan en la misma posición todo está bien (es decir, si su layoutAttributes.frame no cambia).

Sin embargo, tan pronto como vuelvo a maquetar con los layoutAttributes diseño cambiados, layoutAttributes sea ​​para decoración o vistas complementarias, se duplican visualmente, es decir, hay una copia en el fondo en su ubicación original y una copia en su nueva ubicación. El comportamiento es idéntico si los instauro desde XIB o completamente en código y el comportamiento no ocurre para las células normales.

Al principio pensé que se trataba de algún tipo de problema de redibujado, pero estas "copias" sobreviven a la reorganización, el redibujado, etc. Sin embargo, no son copias reales, ya que el layoutAttributesForDecorationView etc. nunca se llama para ellos (solo para las nuevas ubicaciones) . Parece que hay algo de almacenamiento en caché en segundo plano en UICollectionView .

Alguien ha conseguido esto funcionando o tiene alguna idea. Debo decir que soy nuevo en la plataforma de iOS, así que también podría ser cosas simples como configurar las propiedades "Clips Bound" o "Clear Graphics Context" (probé esas, pero podría ser algo similar).

Esto me está volviendo loco y es extraño que no haya absolutamente ningún código de ejemplo.

Me pregunto: ¿la decoración y los puntos de vista suplementarios no están destinados a ser reubicados? (Espero que no)


Creo que Apple va a indicar, al menos en el caso de las vistas de Decoración, que están funcionando según lo previsto. Me encontré con este mismo problema ya que estaba volviendo a dimensionar la última sección e intentando configurar la vista de Decoración para rodear las secciones a medida que cambiaban. Usando una vista simple al principio que solo tenía un fondo rojo, todo el fondo de mi aplicación se volvió rojo y esto me confundió. Posteriormente cambié el alfa a 0.3f en los atributos de diseño de las vistas de decoración y pude verlas una encima de la otra a medida que las secciones cambiaban.

Lo que realmente me avisó de que esto podría ser por diseño fue una línea que leí en un tutorial sobre UICollectionView

Por otro lado, las vistas de decoración son "ornamentales" en lugar de basadas en datos: piense en el fondo de la estantería en la aplicación iBooks.

La clave es que las Vistas de Decoración no son impulsadas por datos y no deberían estar cambiando a medida que sus datos cambian, independientemente de si usted puede hacer esto en el diseño personalizado. Al igual que en el caso de una estantería de libros, el tamaño de los estantes no cambia después de haber sido creados.


Hola, esta es una vieja pregunta, pero hay una respuesta para eso.

En realidad, también tuve estos problemas cuando implementé mi propio objeto Layout, hasta que me di cuenta de que es imprescindible almacenar en caché cualquier atributo de diseño de los objetos que cree en su diseño personalizado. De hecho, hay una referencia muy vaga a esto en la documentación (no recuerdo la ubicación exacta ahora) que se malinterpreta fácilmente.

Básicamente, una vez que haya solicitado un objeto layoutAttributes para una celda en una ruta de índice, debe conservar el objeto de atributos (por ejemplo, retenerlo en un diccionario con la ruta de índice como lo hará una tecla) y devolver el mismo objeto de atributos para cualquiera y todas las subsecuentes solicitudes de los atributos. Si no lo hace, sino que recrea nuevos atributos de diseño, la animación de actualizaciones por lotes da como resultado fallas técnicas graves y artefactos.


Sé que esta es una pregunta antigua, pero me encontré con esto cuando tuve problemas con las vistas adicionales que se duplicaron por todas partes al invalidar un diseño. Creo que es un error, y lo solucioné anulando invalidateLayout en mi objeto de diseño y eliminando las vistas adicionales como se muestra a continuación:

- (void)invalidateLayout { [super invalidateLayout]; // Manually remove all suplementary views of a certain type /** ** This appears to be a BUG. Invalidate view does not remove suplementary view ** from the view hierachy. But they are Orphaned so stay on screen. **/ for (UIView *subview in [self.collectionView subviews]) { if ([subview isKindOfClass:[UICollectionReusableView class]]) { [subview removeFromSuperview]; } } }

Reemplace UICollectionReusableView con la clase de su vista reutilizable que se deja en la pantalla.

Espero que esto ayude a alguien.


Tuve un síntoma similar. Mi problema fue que accidentalmente incluí el ID de reutilización de la vista suplementaria en lugar de kindID al crear mi diseño personalizado.

Específicamente, tuve esto ( Incorrecto )

UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:myViewReuseID withIndexPath:sectionIndexPath];

Cuando debería tener esto ( Derecha )

UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:myViewKindID withIndexPath:sectionIndexPath];

Esto significaba que prepareForReuse nunca se llamaba, y mis viejos puntos de vista nunca desaparecían. En cambio, se acumulaban continuamente.