tutorial custom collection ios xcode uicollectionview uicollectionviewcell

ios - custom - La celda de UICollectionView desapareciendo



uicollectionview swift 4 (8)

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

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

Qué esta pasando

Actualmente tengo una aplicación que usa dos UICollectionViews dentro de una UITableView . De esta manera creo una aplicación similar a Pulse News. Mi problema con esto es que a veces la fila 6ª y 11ª desaparece completamente, 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 el asunto es que está pasando con esas específicas.

Mi teoría

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

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 el 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; }

Entonces, en mi discreción, no hay nada lujoso aquí. Pensé que había algo mal en la fuente de datos (un archivo JSON ficticio), pero a veces funciona bien y la celda se muestra, así que supongo que por 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.

Editar 1.0

La parte asombrosa 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 realmente veo que esto sucede en iOS.

Editar 2.0

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

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

Aún el mismo triste resultado.


En mi caso (desplazamiento vertical, con células desapareciendo en la primera vista), las células desaparecían debido a un tamaño estimado incorrecto. Parece que UICollectionView utiliza el tamaño estimado para calcular los elementos que se cargarán en la primera vista. Establecí el tamaño estimado demasiado alto, lo que dio como resultado cálculos incorrectos para el número de elementos que se cargarán en la primera pantalla.

En el momento en que reduje la altura estimada, todas las celdas aparecieron correctamente.


Entonces, ¿qué funcionó?

1) Subclase UICollectionViewFlowLayout .

2) Establezca flowLayout de mi UICollectionView en mi nueva subclase.

3) En el método init de la subclase UICollectionViewFlowLayout , establezca la orientación que desea:

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.


La sugerencia de Rob sobre el error me ayudó. El error indica que si la sección inserta y el ancho y el espaciado de las celdas se suman exactamente al ancho de la pantalla, la primera columna algunas veces desaparece al azar y reaparece para algunas celdas en algunos lugares. En lugar de subclase o cambiar el ancho de las celdas, cambié las secciones insertadas para la izquierda y la derecha en mi guión gráfico de 6 a 4 y no volví a ver el problema.


Las respuestas anteriores no me funcionaron, pero después de descargar 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, puedes intentarlo.


Ninguna de las soluciones dadas por alguien me ayudó en mi diseño personalizado que tenemos que tener en nuestra aplicación. En cambio, tenía 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 atributos de los elementos que se mostrarán en la pantalla de su pantalla.


Nos encontramos con células desaparecidas recientemente y descubrimos que, en lugar de omitir celdas "ocultas", accidentalmente insertábamos celdas de tamaño 0x0. El comportamiento resultante fue muy confuso y no sugirió que estas células invisibles fueran el problema. Veríamos las celdas y el diseño de tamaño correcto, pero algunas de las celdas válidas desaparecerían sistemáticamente después de desplazarse por la pantalla. No tengo idea de por qué mezclar 0 celdas de tamaño provocaría este comportamiento, pero eliminarlas solucionó el problema. Esto puede no estar causando su problema, pero esto puede ser útil para los desarrolladores que buscan síntomas similares.


Para mí, este problema parecía estar relacionado con la forma en que hago que mi colección se adapte a un teclado abierto para evitar superposiciones 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.SharedApplication.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 # de trabajar con xamarin, pero espero que ayude a alguien más.