59 votes

Disparition de la cellule de UICollectionView

Ce qui se passe

Actuellement, j'ai une application qui utilise deux UICollectionViews à l'intérieur d'un UITableView . De cette façon, je crée une application ressemblant à Pulse News. Mon problème est que parfois la 6ème et la 11ème ligne disparaissent complètement, laissant un espace vide là où devrait se trouver la cellule. Cela ne me dérangerait pas vraiment si toutes les cellules étaient comme ça (et ainsi je pourrais supposer que je ne fais pas les choses correctement), mais le problème est que cela ne se produit qu'avec ces cellules spécifiques.

Ma théorie

Les 6e et 11e rangées sont celles qui apparaissent lorsque je commence à défiler, donc par défaut je suis capable de voir 5 cellules, et lorsque je fais le premier défilement horizontal, la 6e apparaît (espace vide parfois).

Ce que j'ai

La seule chose que je fais en ce moment est ceci :

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

Sur le viewDidLoad . Et sur la création de la cellule :

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

Donc, pour résumer, il n'y a rien d'extraordinaire ici. Je pensais qu'il y avait un problème avec la source de données (un fichier JSON factice), mais parfois cela fonctionne bien et la cellule s'affiche, donc je suppose que cette partie est correcte.

Donc ma "question" : Quelqu'un sait-il ce qui se passe ? Je n'aime pas vraiment dire que c'est un bug d'iOS, mais je ne vois rien d'autre.


Edit 1.0

La partie étonnante est que cette méthode

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

Est-ce que passer de indexPath [0,4] à [0,6] sans calculer le [0,5]. C'est la première fois que je vois cela se produire dans iOS.


Edit 2.0

J'ai changé la façon dont je crée les cellules, et au lieu de mettre en file d'attente, j'utilise l'ancienne méthode :

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

Toujours le même triste résultat.

0 votes

J'obtiens le même problème, mais les cellules qui disparaissent finissent par être rendues en dessous de la cellule précédente ! C'est très étrange. J'ai supposé que c'était un bug dans iOS.

0 votes

Des choses étranges se passent. =/ Mais toujours un contrôleur exceptionnel

0 votes

J'ai une vue de grille classique créée à l'aide d'une vue de collection. J'ai 3 cellules dans une rangée avec de petits espaces. La même chose se produit ici, mais de façon très aléatoire. De temps en temps, une cellule est placée à la quatrième place dans une rangée et à la place attendue, il n'y a rien.

38voto

RuiAAPeres Points 14372

Alors, qu'est-ce qui a marché ?

1) Sous-classe UICollectionViewFlowLayout .

2) Définir le flowLayout de mon UICollectionView à ma nouvelle sous-classe.

3) Sur la méthode init de l UICollectionViewFlowLayout définissez l'orientation que vous souhaitez :

self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

Dans mon cas, c'est Horizontal.

4) Le partie importante :

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

En ce moment, je devrais théoriser un peu, mais honnêtement, je n'ai pas la moindre idée.

3 votes

Jetez un coup d'oeil à ce bug : openradar.appspot.com/12433891 Cela pourrait-il être ce que vous rencontrez ?

0 votes

Je dois être honnête Rob, des choses étranges se produisent lorsque l'on utilise UICollectionView Je ne sais pas si c'est lié ou non.

1 votes

Avez-vous essayé de modifier la largeur et la hauteur des cellules ? J'ai le même problème de rendu avec une vue de collection à défilement horizontal. Des cellules disparaissent lorsque la largeur de la cellule est de 70 et la hauteur de 70. Si je maintiens la largeur de la cellule à 70 et que je modifie la hauteur de la cellule à 69, le rendu est correct. Je peux reproduire cette situation à chaque fois.

19voto

Yao Points 6

Les réponses ci-dessus n'ont pas marché pour moi, mais après avoir téléchargé les images, j'ai remplacé le code [self.myCollectionView reloadData] avec [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; pour rafraîchir la vue de la collection et il montre toutes les cellules, vous pouvez l'essayer.

8voto

iOS_Developer Points 114

Aucune des solutions proposées ne m'a aidé à réaliser la mise en page personnalisée dont nous avons besoin dans notre application. Au lieu de cela, j'ai dû faire ceci : (Et oui, IL MARCHE ! !!)

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

Après tout, UICollectionView ne fait que rechercher les attributs des éléments à afficher dans le rectangle de votre écran.

3voto

plaidbear Points 45

Le conseil de Rob sur le bug m'a aidé. Le bogue stipule que si les insertions de section et les largeurs et espacements des cellules correspondent exactement à la largeur de l'écran, la première colonne disparaît et réapparaît parfois de manière aléatoire pour certaines cellules à certains endroits. Plutôt que de sous-classer ou de modifier la largeur des cellules, j'ai modifié les insets de section pour la gauche et la droite dans mon storyboard de 6 à 4 et le problème ne s'est pas reproduit.

1 votes

Je n'ai pas réussi à le réparer en utilisant la solution de Rob. Mais je suis vraiment heureux que cela ait fonctionné pour vous.

1voto

chandan thakur Points 21

Dans mon cas (défilement vertical, avec disparition des cellules dans la première vue), les cellules disparaissaient en raison d'une taille estimée incorrecte. Il semble, UICollectionView utilise la taille estimée pour calculer les éléments à charger en première vue. J'avais réglé la taille estimée trop haut, ce qui entraînait des calculs erronés pour le nombre d'éléments à charger dans le premier écran.

Au moment où j'ai rendu la hauteur estimée un peu basse, toutes les cellules sont apparues correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X