web-dev-qa-db-fra.com

Hauteur égale de UICollectionViewCell et de UICollectionView

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)
    }
13
LuckyLuke

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.

10
hannad

Vous essayez de définir ce code sur votre viewDidLoad:

self.automaticallyAdjustsScrollViewInsets = false

J'espère que cette aide!

9
vien vu

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 {
    }
0
wlixcc

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.

0
W.K.S

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.

0
bolnad