J'ai fait quelques recherches, mais je n'ai trouvé aucun exemple de code sur la façon de centrer des cellules dans un UICollectionView horizontalement.
au lieu que la première cellule soit comme ce X00 , je veux que ce soit comme ça 0X0 . y a-t-il un moyen d'accomplir cela?
ÉDITER:
pour visualiser ce que je veux:
J'en ai besoin pour ressembler à la version B lorsqu'il n'y a qu'un seul élément dans CollectionView. Quand j'ai plus d'un élément, cela devrait être comme la version A mais avec plus d'éléments.
Pour le moment, cela ressemble à la version A alors que je n'ai qu'un seul élément, et je me demande comment je peux le faire ressembler à B.
Merci pour l'aide!
Réponses:
Ce n'est pas une bonne idée d'utiliser une bibliothèque, si votre but n'est que cela, c'est-à-dire aligner au centre.
Mieux vous pouvez faire ce calcul simple dans votre fonction collectionViewLayout.
la source
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
valeur comme ceci:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1
Swift 4.2
Swift 3
n'oubliez pas d'ajouter le protocole
la source
Essayez ceci pour Swift 4
Ajoutez votre cellWidth à la place de 165,0
la source
J'utilise KTCenterFlowLayout pour cela, et cela fonctionne très bien. C'est une sous-classe personnalisée
UICollectionViewFlowLayout
qui centre les cellules comme vous le souhaitez. (Remarque: ce n'est pas une chose triviale à résoudre en publiant du code, c'est pourquoi je crée un lien vers un projet GitHub!)la source
Une version objective-C de la réponse de Darshan Patel :
la source
En modifiant légèrement la réponse de @Safad Funy, c'est ce qui a fonctionné pour moi dans la dernière version de Swift & iOS. Dans ce cas, je voulais que la largeur des cellules soit un tiers de la taille de la vue de collection.
la source
Vous pouvez utiliser cette extension (Swift 4).
Il peut centrer les cellules avec si vous en
collectionView
avezlayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Il fonctionne avec toutes les tailles de cellules et fonctionne parfaitement lorsque
scrollDirection = .horizontal
J'espère que cela vous aidera!
la source
Swift 4.2 (horizontalement et verticalement). C'est une petite mise à jour du code Pink Panther et un grand merci!
Assurez-vous que votre classe est conforme au protocole UICollectionViewDelegateFlowLayout
la source
Voici la nouvelle version pour Swift 5 qui fonctionne également très bien lorsque les cellules sont plus d'une ligne:
Veuillez vous assurer que votre classe est conforme au
UICollectionViewDelegateFlowLayout
protocole.la source
Swift 4
la source
Pour les personnes qui souhaitent uniquement ajouter un rembourrage ( haut, gauche, bas, droite ):
Ajouter le protocole
UICollectionViewDelegateFlowLayout
Cet exemple montre un remplissage à gauche et à droite avec 40.
la source
SWIFT 4.2
//
la source
Vous pouvez essayer ma solution, cela fonctionne bien,
la source
La réponse acceptée est la bonne réponse, mais si votre
totalCellWidth
est inférieur auCollectionView
swidth
, mais juste pour vous prémunir contre cela, vous pouvez faire comme ci-dessous.la source
Ce code doit centrer horizontalement la vue de la collection même dans Swift 4.0 sans aucune modification:
Assurez-vous que votre classe est conforme au
UICollectionViewDelegateFlowLayout
protocolela source
J'ai fini par adopter une approche complètement différente ici, ce qui, je crois, mérite d'être mentionné.
J'ai défini une contrainte sur la vue de ma collection pour qu'elle soit alignée horizontalement au centre. Ensuite, j'ai défini une autre contrainte qui spécifie la largeur. J'ai créé une sortie pour la contrainte de largeur à l' intérieur de mon viewController qui contient la vue de collection. Ensuite, lorsque ma source de données est modifiée et que je mets à jour la vue de la collection, je prends le nombre de cellules et fais un calcul (très similaire) pour réinitialiser la largeur.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Ensuite, je règle la
.constant
valeur de la prise de contrainte sur le résultat du calcul et la mise en page automatique fait le reste.Cela peut entrer en conflit avec le `UICollectionViewDelegateFlowLayout, mais cela a parfaitement fonctionné pour moi pour créer une vue de collection justifiée à gauche. Sans délégué, cela ne semble fonctionner que lorsque les cellules remplissent la majorité de la vue.
la source
Solution générale pour la disposition des flux qui centre les pages si elles sont inférieures à la largeur et s'aligne à gauche s'il y en a plus
Version Swift (convertie depuis ObjC)
la source
J'ai une situation similaire dans le projet, et je l'ai corrigée en me référant
UPCarouselFlowLayout
Je pense qu'il prend en charge la
swift 5
versionhttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Regardez l'implémentation du code dans
la source
le moyen le plus simple consiste à définir la taille estimée de la vue de collection sur Aucune dans le storyboard ou avec le code
layout.estimatedItemSize = CGSize.zero
la source
S'il n'y a de place que pour une cellule par groupe, un
leading:
ettrailing:
de.flexible(0)
centreront la cellule horizontalement:la source
J'ai utilisé ce code dans un projet. Il centre la collectionView horizontalement et verticalement dans les deux sens
.horizontal
et en.vertical
utilisant les inserts de section. Respecte l'espacement et l'encart d'origine de la section s'il est défini. Code à utiliser dans le déléguéUICollectionViewDelegateFlowLayout
afin que nous ayons accès à toutes les propriétés que nous devons récupérer à partir deUIcollectionView
ou définies dans le storyboard pour la réutilisation.J'espère que cela aiderait quelqu'un - il centre la section pas les éléments à l'intérieur de la section, pour plus, nous devons sous-classer le
UICollectionViewFlowLayout
ouUICollectionViewLayout
comme exemple de mosaïque d'Apple.la source
Je pense que vous devez centrer la cellule, donc au lieu d'utiliser collectionView, je voudrais que UITableView soit d'une grande utilité. Utilisez simplement un UIViewController et placez deux UIViews à l'avant et à l'arrière et placez un
UITableView
au milieu Espérons que cela aidela source