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.

1voto

tyler Points 903

Nous avons récemment été confrontés à des disparitions de cellules et nous avons découvert qu'au lieu de sauter des cellules "cachées", nous insérions accidentellement des cellules de taille 0x0. Le comportement résultant était très déroutant et ne suggérait pas que ces cellules invisibles étaient le problème. Nous pouvions voir les cellules de taille correcte et la mise en page, mais quelques-unes des cellules valides disparaissaient systématiquement après le défilement de l'écran. Je n'ai aucune idée de la raison pour laquelle l'imbrication de cellules de taille 0 provoquerait ce comportement, mais leur suppression a réglé le problème. Ce n'est peut-être pas la cause de votre problème, mais cela peut être utile aux développeurs qui recherchent des symptômes similaires.

1voto

fewlinesofcode Points 2727

Comme j'ai rencontré le même problème soudainement et que j'ai passé un certain temps à trouver l'une des raisons possibles de la disparition de la cellule pendant le défilement, je vais ajouter ma réponse également.

Conditions préalables du problème :

  1. Vous avez un UICollectionView instance
  2. Vous avez un UICollectionViewFlowLayoutSubclass

Le problème

Les cellules disparaissent de la vue de la collection après avoir défilé jusqu'à un certain point.

La source du problème se trouve dans une sous-classification erronée de l'élément UICollectionViewFlowLayout .

Comme elle l'a explicitement dit dans documentation :

Chaque objet de mise en page doit mettre en œuvre les méthodes suivantes :

- collectionViewContentSize
- layoutAttributesForElements(in:)
- layoutAttributesForItem(at:)
- layoutAttributesForSupplementaryView(ofKind:at:) // (if your layout supports -supplementary views)
-layoutAttributesForDecorationView(ofKind:at:) // (if your layout supports decoration views)
- shouldInvalidateLayout(forBoundsChange:)

En s'appuyant sur UICollectionViewFlowLayout mise en œuvre des méthodes ci-dessus, nous passons à côté du fait que func layoutAttributesForElements(in rect: CGRect) y collectionViewContentSize générera une erreur contentSize (la taille qui serait correcte si toutes les cellules avaient itemSize et la taille du contenu correspondraient. Dès que le scroll offsetY sera plus grande que contentSize la cellule de hauteur va disparaître.

La solution

La solution est dans le bon UICollectionViewFlowLayout sous-classement. Surchargez toutes les méthodes qui sont nécessaire pour passer outre et tout fonctionnera très bien.

0voto

Peter Points 101

Je viens de rencontrer un problème où toutes les cellules de UICollectionView disparaissaient lors du défilement.

C'est arrivé parce que j'avais déclaré

extension UICollectionViewLayout {
    static let defaultLayout: UICollectionViewLayout {
        let layout = UICollectionViewFlowLayout()
        layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        return layout
    }()
}

... ce qui signifie que la même instance de layout était utilisée dans plusieurs UICollectionViews. J'avais l'intention d'en faire une variable calculée. J'espère que cela aidera quelqu'un qui utilise accidentellement le même objet de disposition dans plusieurs vues de collection.

0voto

singingAtom Points 799

Dans mon cas, les cellules ont disparu parce que la source de données a été désallouée prématurément. UICollectionView.dataSource est une propriété faible, ce qui signifie qu'à moins que vous ne conserviez une référence forte à celle-ci, l'objet sera désalloué à la fin de la portée dans laquelle vous l'avez créé. Le problème s'est manifesté par la disparition de cellules dès que j'ai tapé sur l'objet UICollectionView .

-1voto

Andreas Müller Points 673

Pour moi, ce problème semble être lié à la façon dont je fais en sorte que ma vue de collection s'adapte à un clavier ouvert pour éviter les chevauchements de contenu.

dans mon observation pour répondre à KeyboardWillShow j'ai eu ceci :

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

Après l'avoir changé en ceci :

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

Le problème de la disparition des cellules a complètement disparu. Il s'agit de C# et je travaille avec xamarin, mais j'espère que cela aidera quelqu'un d'autre.

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