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.
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))
iOS 10: la vue la plus haute n'était pas connectée à la prise de vue
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.
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
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];
//...
}