Comment suis-je censé définir la hauteur des cellules dans UICollectionView égale à la hauteur de la vue de collection? Le code ci-dessous ne fonctionne pas car la hauteur des vues de collection n'est pas connue à ce stade, car il semble que la présentation automatique perturbe les propriétés à ce stade. La hauteur des cellules est supérieure à la vue de la collection réelle.
Je vais ajouter 300 en prime à une réponse qui résout ce problème!
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 100, height: collectionView.frame.size.height)
}
2015-12-16 18: 43: 53.643 My-app [1055: 434762] le comportement du code enter IciUICollectionViewFlowLayout n'est pas défini parce que: 2015-12-16 18: 43: 53.643 My-app [1055: 434762], la hauteur de l'élément doit être inférieure à la hauteur De UICollectionView moins les valeurs insérées en haut et en bas , moins le contenu inséré entre les valeurs inférieure et supérieure. 2015-12-16 18: 43: 53.643 My-app [1055: 434762] Veuillez vérifier les valeurs renvoyées par le délégué . 2015-12-16 18: 43: 53.644 My-app [1055: 434762] L'instance pertinente UICollectionViewFlowLayout est, et elle est attachée à; couche =; contentOffset: {0, 0}; contentSize: {3087, 307}> disposition de la vue de collection:. 2015-12-16 18: 43: 53.644 My-app [1055: 434762] Créer un point d'arrêt symbolique sur UICollectionViewFlowLayoutBreakForInvalidSizes pour intercepter cela dans le débogueur .
Solution qui fonctionne sur la suggestion hannads. S'il y a de meilleurs moyens s'il vous plaît faites le moi savoir
Fait une propriété avec un observateur de propriété.
var myCollectionViewHeight: CGFloat = 0.0 {
didSet {
if myCollectionViewHeight != oldValue {
myCollectionView.collectionViewLayout.invalidateLayout()
myCollectionView.collectionViewLayout.prepareLayout()
}
}
}
Ignorer cette méthode (on l'appelle plusieurs fois)
override func viewDidLayoutSubviews() {
myCollectionViewHeight = myCollectionView.bounds.size.height
}
Ensuite, j'ai ceci dans mon délégué:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 100, height: myCollectionViewHeight)
}
Voici comment je le ferais. Ajoutez d’abord une variable globale dans le contrôleur de vue qui sera utilisée pour stocker la hauteur de la vue de collection. Dans la méthode viewDidLayoutSubviews
, définissez cette variable à la hauteur de collectionView et, si elle a été modifiée, appelez une méthode pour invalider la présentation UICollectionView
.
collectionView.collectionViewLayout.invalidateLayout()
Ce qui appellera la méthode pour définir les tailles des cellules collectionView, et dans cette méthode, définira la hauteur de la cellule sur la variable globale contenant la hauteur de la collectionView.
Remarque : actuellement sur mon téléphone portable et n'a pas testé ce code. J'ai peut-être manqué quelque chose.
Vous essayez de définir ce code sur votre viewDidLoad
:
self.automaticallyAdjustsScrollViewInsets = false
J'espère que cette aide!
Dans mon cas, j'ajoute collectionview à tableviewcell , et la hauteur de l'élément collectionview est égale à la hauteur de la tableviewcell. quand je change de table, je reçois cet avertissement. Pour résoudre ceci, essayez ce code
if (@available(iOS 11.0, *)) {
_collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
}
J'ai eu ce problème parce que j'avais épinglé ma UICollectionView
au bas d'une UITableViewCell
sans donner à la collectionView
une hauteur.
Après avoir effectué quelques requêtes réseau, puis appelé [self.tableView reloadData]
dans la variable UIViewController
, le même message d’erreur s’affiche dans le journal.
J'ai réussi à le résoudre en brisant la contrainte du bas et en donnant à la UICollectionView
une hauteur fixe.
J'ai rencontré ce problème aussi et j'ai pu le résoudre en soustrayant le sectionInsets
pertinent. Une fois que vous soustrayez les incrustations qui ne sont pas prises en compte dans la propriété .size.height
, il accepte la hauteur.
Dans sizeForItemAtIndexPath
, vous devez soustraire les dimensions d'encart de section ...
let sectionInset = self.collectionView?.collectionViewLayout.sectionInset
let heightToSubtract = sectionInset!.top + sectionInset!.bottom
return CGSize(width: 100.0, height: (self.collectionView?.bounds.height)! - heightToSubtract)
NOTE: Je force de dérouler les options ici, mais pour plus de sécurité, vous pouvez les vérifier.