web-dev-qa-db-fra.com

Problème de mise en page UICollectionView

J'utilise UICollectionView en utilisant la disposition de flux . J'ai créé une UICollectionViewCell personnalisée pour le même . 

le comportement de UICollectionViewFlowLayout n'est pas défini car: la hauteur de l'élément doit être inférieure à la hauteur de la variable UICollectionView moins les valeurs supérieures et inférieures insérées dans la section.

Je me suis assuré que la taille de la cellule est correcte

Quelqu'un at-il été en mesure de résoudre ce problème… .. Merci d'avance.

Cordialement Nitesh

57
Nitesh

J'ai trouvé que, avec storyboards, vous devez aller dans la storyboard et cliquer sur le View Controller global (la vue doit être surlignée en bleu) et aller au Attributes Inspector (le quatrième onglet à droite de l'écran) et décocher la case Sous les barres supérieures "," Sous les barres inférieures "et" Sous les barres opaques ". Cela a éclairci la question pour moi, et cela a également été clarifié pour mes collègues.

37
Connor Wagner

J'ai eu quelques problèmes lors de l'utilisation d'une vue de collection pour présenter des contrôleurs de vue plein écran. 

En principe, lors de l'exécution, il vous demandera la taille de l'élément et renverra simplement la taille de la vue de collection:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.collectionView.frame.size;
}
27
ninjaneer

Je sais que c'est une réponse très tardive, mais j'ai aussi vécu cela. 

Dans mon contrôleur de vue, appelons-le MyViewController J'ai une UICollectionView qui utilise la personnalisation UICollectionViewCells. J'implémente la méthode collectionView: layout: sizeForItemAtIndexPath où je renvoie une taille d'élément qui dépend de la hauteur de UICollectionView.

(MyViewController} _ est créé dans un scénario en utilisant autolayout pour contrôler la hauteur de UIViewController.

Les cellules ont une belle apparence en mode portrait, mais pas en mode paysage. 

J'ai résolu mes problèmes en invalidant la UICollectionViewLayout de ma UICollectionView dans la méthode viewWillLayoutSubviews.

- (void)viewWillLayoutSubviews {
    [self.myCollectionView.collectionViewLayout invalidateLayout];
}

Auparavant, j'avais essayé d'invalider la mise en page dans willAnimateRotationToInterfaceOrientation:duration, mais cela ne fonctionnait pas. La raison en est probablement que les tailles de toutes les vues ne sont pas encore calculées. Nous devons donc attendre la fin de la magie de l'autolayout. Je fais référence à ce fil SO .

Mise à jour pour Swift 4.0:

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.myCollectionView.collectionViewLayout.invalidateLayout()
  }
22
Sajjon

J'avais moi-même eu ce problème à quelques reprises lorsque je tentais de créer des vues de collection avec des cellules en plein écran. Mon problème était causé par la mise en page pour 4 "écran dans IB/Storyboard et spécifiant 320 * 568 pour la taille de l'élément, mais en cours d'exécution dans le simulateur en utilisant 3,5" écran, qui a une hauteur de 480. La solution est de spécifier votre taille d'élément dans code avec quelque chose comme:

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = self.collectionView.frame.size;

Cela garantit que la taille de la cellule est correctement définie au moment de l'exécution.

18
Jonathan Crooke

Si vous utilisez des storyboards et une mise en page automatique, résoudre ce type de problèmes est vraiment difficile ... 

J'avais un problème similaire lorsque j'essayais d'afficher UICollectionViewCell en plein écran sur iPhone.

La plupart du temps, le problème concerne la taille de la cellule définie dans 

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)

ou directement sur flowLayout.itemSize.

Mais essayez:

  1. Sélectionnez le ViewController:

Selecting View Controller

  1. Puis décochez les options d’extension des bords:

Disable Extend Edges Options

Et maintenant, essayez de définir vos contraintes de mise en page automatique. 

Bonne chance.

10
DarkoM

Cela a résolu mon problème:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70);
}

Vous pouvez voir la valeur de remplissage de haut en bas sur cet écran:

 enter image description here

3
Nik Kov

Assurez-vous de définir le masque de redimensionnement automatique correct pour UICollectionView et UICollectionviewcell .Cela a résolu mon problème pour iPhone 4 Simulator.

2
Oleg Prymak

Pour moi, j'utilise AKPickerView dans une UIView personnalisée qui me donnait une série d'avertissements comme ceux mentionnés ici. Tout ce que j'ai fait pour éliminer les avertissements, c'est de décocher la case "Redimensionnement automatique des vues partielles" dans l'inspecteur des attributs pour ma vue UIV personnalisée. Cela a tellement fait taire les avertissements que je pensais que mon enregistreur de données avait cessé de fonctionner. 

 enter image description here

2
Dave Levy

Je viens de recevoir le même message d'erreur, mais pour moi le problème était que, lorsque j'ai reçu de nouvelles données de l'API et que j'ai essayé de rafraîchir mon collectionView, la méthode appelée [collectionView reloadData] ne l'appelait pas sur le thread principal.

J'espère que ça aide quelqu'un ...

1
SeanT

J'ai le même problème

le comportement de UICollectionViewFlowLayout n'est pas défini car: 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 de la section.

J'ai résolu ce problème en vérifiant les valeurs de la section Insets.And pour la taille de cellule fixe, j'ai utilisé le code ci-dessous.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
CGFloat cellWidth =  [[UIScreen mainScreen] bounds].size.width - 20;
CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120;

return CGSizeMake(cellWidth, cellHeight);


}
1
Maishi Wadhuwani

Si vous chargez une collectionView via une vue conteneur + UICollectionViewController, vous avez peut-être défini une contrainte de hauteur sur la vue container qui contraint la hauteur de la vue de collection elle-même. Dans mon cas, j'ai trouvé que collectionView.contentSize était plus grand que la contrainte que j'avais définie pour la vue Conteneur.

Évidemment, c’est un peu un cas d’Edge, mais juste au cas où vous auriez une configuration similaire, j’ai pensé ajouter ce commentaire.

0
the_dude_abides

Ce qui a provoqué cela pour moi, c'est que j'essayais de donner à mes cellules la taille du superview plutôt que celle de UICollectionView. Il suffit de remplacer le cadre superview par le cadre UICollectionView.

0
spogebob92