web-dev-qa-db-fra.com

Pourquoi UICollectionView enregistre-t-il une erreur lorsque les cellules sont en plein écran?

J'ai une UICollectionViewController utilisant une UICollectionViewFlowLayout où ma itemSize est la taille de la UICollectionView. Fondamentalement, il s'agit d'une disposition en ligne de cellules où chaque cellule est plein écran et défile horizontalement. 

Dans ma sous-classe UICollectionViewFlowLayout, j'ai remplacé prepareLayout comme suit:

- (void)prepareLayout {
    self.itemSize = self.collectionView.frame.size;
    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    self.collectionView.pagingEnabled = YES;
    self.minimumLineSpacing = 0.0;
    self.minimumInteritemSpacing = 0.0;
    self.sectionInset = UIEdgeInsetsZero;
    self.footerReferenceSize = CGSizeZero;
    self.headerReferenceSize = CGSizeZero;
}

La UICollectionViewController est très basique, renvoyant 10 éléments dans une section. J'ai inclus un exemple de projet sur GitHub pour plus de détails. 

Tout semble être configuré correctement. Cela a l'air bien dans le simulateur et sur le périphérique mais, lorsque la vue Collection est affichée, une erreur est consignée dans la console:

the behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less that the height of the UICollectionView minus the section insets top and bottom values.

Notez également que le contrôleur de vue de collection dans mon exemple se trouve dans un contrôleur de navigation et que cela ne semble pas particulièrement nécessaire dans l'exemple, dans mon cas réel, j'ai besoin de la vue de collection dans un contrôleur de navigation.

25
Wes

Ce problème m’était venu à l’esprit sur 3 écrans (notamment l’iPhone 6 Plus). En fin de compte, le moteur d’autolayout n’aimait pas vraiment les valeurs à virgule flottante infinie (comme .33333333); ma solution était donc de floor la hauteur de retour en sizeForItemAt:indexPath:.

return CGSize(width: preferredWidth, height: floor(preferredHeight))
4
Tamás Sengel

iOS 10: la vue la plus haute n'était pas connectée à la prise de vue

1
Anton Tropashko

Mise à jour iOS 11: automaticallyAdjustsScrollViewInsets est obsolète dans iOS 11.0. 

Apple recommande d'utiliser plutôt la méthode UIScrollView's contentInsetAdjustmentBehavior. J'ai mis cette valeur à .never et l'erreur a disparu. Vous pouvez également définir cette propriété dans Interface Builder.

0
Legonaftik

J'ai eu le même problème.

Après cellule de charge qui est pleine largeur et une certaine hauteur de l'écran. à une certaine condition j'ai changé la hauteur de la cellule alors je devenais la même erreur

pour résoudre ce problème 

J'ai utilisé

   func updateHeightPerRatio(with image:UIImage) {
    let ratio = collectionView.bounds.width / image.size.width
    constHeightCollectionView .constant =  ceil(image.size.height * ratio)
    collectionView.reloadData()
    collectionView.performBatchUpdates({
        collectionView.layoutIfNeeded()
    }) { (completed) in
        self.collectionView.reloadData()
        self.layoutIfNeeded()
    }
}

La solution consiste à recharger les données, puis effectuez une mise à jour par lots avec cette vue de collection qui recalcule les images. après que recharger collectionview à nouveau, il appliquera des images calculées à la cellule 

Et maintenant, il n'y a pas de journal pour le problème maintenant.

J'espère que c'est utile 

0
Prashant Tukadiya

J'ai rencontré ce problème lors de la rotation de l'appareil de portrait en paysage, puis de nouveau en portrait. Vous souhaitez invalider la présentation de collectionView lors de la rotation du périphérique et avant l'appel de super, comme suit:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    // Causes collection view cells to be resized upon orientation change.
    // Important that this is called *before* call to super in order to prevent error from being logged to console.
    [self.collectionView.collectionViewLayout invalidateLayout];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    //...
}
0
Stunner