La celda UICollectionView desaparece

Que está pasando

Actualmente tengo una aplicación que utiliza dos UICollectionViews dentro de una UITableView . De esta forma, creo una Pulse News como aplicación. Mi problema con esto es que a veces la fila 6 y 11 desaparece por completo, dejando un espacio en blanco donde debería estar la celda. Realmente no me importaría, si todas las células fueran así (y de esta manera podría asumir que no estaba haciendo las cosas correctamente), pero la cosa es que está sucediendo con esas específicas.

Mi teoría

Las filas 6 y 11 son las que aparecen cuando comienzo a desplazarme, así que de manera pnetworkingeterminada puedo ver 5 celdas y, cuando hago el primer desplazamiento horizontal, aparece el 6 (espacio en blanco a veces).

Lo que tengo

Lo único que estoy haciendo en este momento es esto:

  [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER]; 

En la viewDidLoad . Y en la creación de la celda:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath]; NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]]; [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController]; return cell; } 

Así que, subestimando, no pasa nada aquí. Pensé que había algo mal en la fuente de datos (un file JSON ficticio), pero a veces funciona bien y la celda aparece, así que supongo que desde esa parte está bien.

Entonces, mi "pregunta": ¿Alguien sabe lo que está pasando? Realmente no me gusta decir que es un error de iOS, pero no puedo pensar en nada más.


Edit 1.0

Lo sorprendente es que este método

 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 

Va de indexPath [0,4] a [0,6] sin calcular el [0,5]. La primera vez que veo que esto sucede en iOS.


Edit 2.0

He cambiado la forma en que estoy creando las celdas y, en lugar de eliminarlas, estoy usando la vieja forma:

 NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil]; MyCell *cell = (MyCell *)[nib objectAtIndex:0]; 

Aún el mismo triste resultado.

Entonces, ¿qué funcionó?

1) Subclass UICollectionViewFlowLayout .

2) Establecer el flowLayout de mi UICollectionView en mi nueva subclass.

3) En el método init de la subclass UICollectionViewFlowLayout , configure la orientación que desee:

 self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

En mi caso, es horizontal.

4) La parte importante :

 -(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { return YES; } 

En este momento, debería teorizar un poco, pero, sinceramente, no tengo ni idea.

Las respuestas anteriores no funcionaron para mí, pero después de download las imágenes, reemplacé el código [self.myCollectionView reloadData] con [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; para actualizar la vista de colección y muestra todas las celdas, puede intentarlo.

Ninguna de las soluciones ofrecidas por nadie me ayudó en mi layout personalizado que necesitamos tener en nuestra aplicación. En cambio, tuve que hacer esto: (Y sí, ¡FUNCIONA !)

 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ CGSize size = [self collectionViewContentSize]; rect.size.height = size.height*2; NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect]; return atrributes_Super; } 

Después de todo, UICollectionView solo busca los attributes para que los elementos se muestren en el rect de la pantalla.

La sugerencia de Rob sobre el error me ayudó. El error indica que si las inserciones de la sección y el ancho de las celdas y el espacio se sumn exactamente al ancho de la pantalla, la primera columna desaparece random y reaparece para algunas celdas en algunos lugares. En lugar de subclass o cambiar los anchos de celda, cambié las inserciones de la sección de izquierda y derecha en mi guión gráfico de 6 a 4 y no he vuelto a ver el problema.

En mi caso (desplazamiento vertical, con las celdas desapareciendo en la primera vista), las celdas estaban desapareciendo debido al tamaño estimado incorrecto. Parece que UICollectionView usa el tamaño estimado para calcular los elementos que se deben cargar en la primera vista. Establecería el tamaño estimado demasiado alto, lo que resultaría en cálculos incorrectos para la cantidad de elementos que se cargarán en la primera pantalla.

En el momento en que hice que la altura estimada fuera baja, todas las celdas aparecieron correctamente.

Para mí, este problema parecía estar relacionado con la forma en que hago que mi colección se adapte a un keyboard abierto para evitar solapamientos de contenido.

en mi observador para responder a KeyboardWillShow tuve esto:

 var userInfo = obj.UserInfo[UIKeyboard.FrameEndUserInfoKey]; if (userInfo is NSValue value) { var rect = value.CGRectValue; var windowOffset = this.Superview.ConvertPointToView(this.Frame.Location, UIApplication.ShanetworkingApplication.KeyWindow); var newHeight = rect.Y - windowOffset.Y; this._controller.CollectionView.Frame = new CGRect(0, 0, this._controller.CollectionView.Frame.Width, newHeight); } 

Después de cambiarlo a esto:

 var userInfo = obj.UserInfo[UIKeyboard.FrameBeginUserInfoKey]; if (userInfo is NSValue value) { var rect = value.CGRectValue; UIEdgeInsets contentInsets = new UIEdgeInsets(0, 0, rect.Height, 0); this._controller.CollectionView.ContentInset = contentInsets; this._controller.CollectionView.ScrollIndicatorInsets = contentInsets; } 

El problema de la desaparición celular desapareció por completo. Esto es C # al trabajar con xamarin, pero espero que ayude a otra persona.

Creo que esto no es un error de UICollectionView, tal vez no devuelva datos correctos en - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect method.

Puede ver esta demostración: https://github.com/lqcjdx/YLTagsChooser , todas las celdas pueden aparecer al arrastrar el UICollectionView.