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
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.
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;
}
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 UICollectionViewCell
s. 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()
}
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.
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:
Et maintenant, essayez de définir vos contraintes de mise en page automatique.
Bonne chance.
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:
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.
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.
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 ...
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);
}
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.
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
.