J'utilise actuellement UICollectionView
pour la grille d'interface utilisateur, et cela fonctionne très bien. Cependant, j'aimerais pouvoir activer le défilement horizontal. La grille prend en charge 8 éléments par page et lorsque le nombre total d'éléments est, par exemple, 4, voici comment les éléments doivent être organisés avec le sens de défilement horizontal activé:
0 0 x x
0 0 x x
Ici 0 -> Élément de collection et x -> Cellules vides
Existe-t-il un moyen de les aligner au centre comme:
x 0 0 x
x 0 0 x
Pour que le contenu soit plus propre?
L'arrangement ci-dessous pourrait également être une solution que j'attends.
0 0 0 0
x x x x
minimumInteritemSpacing
n'indique que leur minimum.return UIEdgeInsetsMake(0, 100, 0, 100);
. S'il y a plus d'espace, la vue de la collection élargira l'espacement intermédiaire, vous devez donc vous assurer que LeftInset + CellWidth * Ncells + CellSpacing * (Ncells-1) + RightInset = CollectionViewWidthPour ceux qui recherchent une solution aux cellules de vue de collection alignées au centre et à largeur dynamique , comme je l'étais, j'ai fini par modifier la réponse d'Angel pour une version alignée à gauche pour créer une sous-classe alignée au centre
UICollectionViewFlowLayout
.CenterAlignedCollectionViewFlowLayout
la source
guard let superArray = super.layoutAttributesForElementsInRect(rect) else { return nil } guard let attributes = NSArray(array: superArray, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil }
interItemSpacing
pour utiliser la valeur par défautminimumInteritemSpacing
.Les principales solutions ici ne fonctionnaient pas pour moi prêtes à l'emploi, j'ai donc proposé ceci qui devrait fonctionner pour toute vue de collection à défilement horizontal avec une disposition de flux et une seule section:
la source
Il est facile de calculer des inserts dynamiquement, ce code centrera toujours vos cellules:
la source
Semblable à d'autres réponses, il s'agit d'une réponse dynamique qui devrait fonctionner pour les cellules de taille statique. La seule modification que j'ai apportée est que j'ai mis le rembourrage des deux côtés. Si je ne faisais pas cela, j'ai rencontré des problèmes.
Objectif c
Rapide
En outre, si vous rencontrez toujours des problèmes, assurez-vous que vous définissez à la fois
minimumInteritemSpacing
etminimumLineSpacing
sur les mêmes valeurs, car ces valeurs semblent être liées entre elles.la source
Mettez ceci dans votre délégué de vue de collection. Il considère davantage les paramètres de mise en page de flux de base que les autres réponses et est donc plus générique.
version rapide (merci g0ld2k):
la source
totalCellWidth
devrait êtrecellWidth*cellCount + spacing*(cellCount-1)
.Ma solution pour les cellules de vue de collection de taille statique qui doivent avoir un rembourrage à gauche et à droite-
la source
J'ai une barre de balises dans mon application qui utilise un
UICollectionView
&UICollectionViewFlowLayout
, avec une rangée de cellules alignées au centre.Pour obtenir le retrait correct, vous soustrayez la largeur totale de toutes les cellules (y compris l'espacement) de la largeur de votre
UICollectionView
, et divisez par deux.Le problème est cette fonction -
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
est appelé avant ...
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
... vous ne pouvez donc pas parcourir vos cellules pour déterminer la largeur totale.
Au lieu de cela, vous devez calculer à nouveau la largeur de chaque cellule, dans mon cas, j'utilise
[NSString sizeWithFont: ... ]
car mes largeurs de cellule sont déterminées par le UILabel lui-même.la source
interSpacing
?interSpacing
est juste une constante dans mon code, qui détermine l'espace que j'ai entre UICollectionViewCellsDans Swift, ce qui suit distribuera les cellules uniformément en appliquant la bonne quantité de remplissage sur les côtés de chaque cellule. Bien sûr, vous devez d'abord connaître / définir la largeur de votre cellule.
la source
Swift 2.0 fonctionne bien pour moi!
Où: screenWight : essentiellement la largeur de ma collection (largeur totale de l'écran) - J'ai créé des constantes: laissez screenWight: CGFloat = UIScreen.mainScreen (). Bounds.width parce que self.view.bounds montre à chaque fois 600 - coz des éléments SizeClasses - tableau de cellules 50 - ma largeur de cellule manuelle 10 - ma distance entre les cellules
la source
Vous pouvez utiliser https://github.com/keighl/KTCenterFlowLayout comme ceci:
la source
Vous ne savez pas si c'est nouveau dans Xcode 5 ou non, mais vous pouvez maintenant ouvrir l'inspecteur de taille via Interface Builder et y définir un encart. Cela vous évitera d'avoir à écrire du code personnalisé pour le faire à votre place et devrait augmenter considérablement la vitesse à laquelle vous trouvez les décalages appropriés.
la source
Une autre façon de procéder consiste à définir le
collectionView.center.x
, comme ceci:Dans ce cas, ne respectant que le bon encart qui fonctionne pour moi.
la source
Sur la base de la réponse user3676011, je peux en suggérer une plus détaillée avec une petite correction. Cette solution fonctionne très bien sur Swift 2.0 .
Il y avait un problème dans
où devrait être
-1
mentionné plus .la source
C'est ainsi que j'ai obtenu une vue de collection alignée au centre avec un espacement Interitem fixe
la source
Version de travail de la réponse Objective C de kgaidis utilisant Swift 3.0:
la source
Voici ma solution avec quelques hypothèses:
N'hésitez pas à vous adapter à vos besoins.
Disposition centrée avec largeur de cellule variable:
Résultat:
la source
Voici comment vous pouvez le faire et cela fonctionne bien
la source