Je viens de commencer à découvrir UICollectionViews. Je me demande si quelqu'un sait comment spécifier le nombre de colonnes dans une vue de collection. La valeur par défaut est 3 (iPhone / portrait). J'ai regardé la documentation et je n'arrive pas à trouver une réponse concise.
100
UICollectionView
essentiellement comme une grille car je sais que je ne veux que 4 colonnes. Je fais cela en donnant à mes cellules une certaine taille et l'espacement entre elles à une certaine taille afin que la vue de collection ne montre que 4 colonnes, quelle que soit l'orientation. Est-ce similaire à ce dont vous avez besoin?Réponses:
Les CollectionViews sont très puissantes et ont un prix. Beaucoup et beaucoup d'options. Comme l'a dit Omz:
Je suggère de mettre en œuvre le
<UICollectionViewDelegateFlowLayout>
protocole, en vous donnant accès aux méthodes suivantes dans lesquelles vous pouvez avoir un plus grand contrôle sur la mise en page de votreUICollectionView
, sans avoir besoin de le sous-classer:collectionView:layout:insetForSectionAtIndex:
collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
collectionView:layout:minimumLineSpacingForSectionAtIndex:
collectionView:layout:referenceSizeForFooterInSection:
collectionView:layout:referenceSizeForHeaderInSection:
collectionView:layout:sizeForItemAtIndexPath:
De plus, l'implémentation de la méthode suivante forcera votre UICollectionView à mettre à jour sa mise en page lors d'un changement d'orientation: (disons que vous vouliez redimensionner les cellules pour le paysage et les étirer)
De plus, voici 2 très bons tutoriels sur
UICollectionViews
:http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
http://skeuo.com/uicollectionview-custom-layout-tutorial
la source
collectionView:layout:sizeForItemAtIndexPath:
être traité séparément pour tous les appareils?new GridLayoutManager(mContext, 4))
(4 colonnes), très facile, ou simplement utiliserLinearLayoutManager
(il n'a bien sûr qu'une seule colonne)Avec Swift 5 et iOS 12.3, vous pouvez utiliser l'une des 4 implémentations suivantes afin de définir le nombre d'éléments par ligne dans votre
UICollectionView
tout en gérant les insertions et les changements de taille (y compris la rotation).#1. Sous
UICollectionViewFlowLayout
- classement et utilisation deUICollectionViewFlowLayout
laitemSize
propriétéColumnFlowLayout.swift:
CollectionViewController.swift:
# 2. Utilisation de
UICollectionViewFlowLayout
laitemSize
méthode de# 3. Utilisation de
UICollectionViewDelegateFlowLayout
lacollectionView(_:layout:sizeForItemAt:)
méthode de# 4. Sous
UICollectionViewFlowLayout
- classement et utilisation deUICollectionViewFlowLayout
laestimatedItemSize
propriétéCollectionViewController.swift:
FlowLayout.swift:
Cell.swift:
la source
J'ai implémenté
UICollectionViewDelegateFlowLayout
sur monUICollectionViewController
et écraser la méthode chargée de déterminer la taille de la cellule. J'ai ensuite pris la largeur de l'écran et l'ai divisée avec mon exigence de colonne. Par exemple, je voulais avoir 3 colonnes sur chaque taille d'écran. Alors, voici à quoi ressemble mon code -la source
Élargissement de la réponse de noob:
Cela permet tout espacement entre les cellules. Il suppose une
Int
variable membre appeléenumberOfItemsPerRow
et également que toutes les cellules sont carrées et de même taille. Comme indiqué dans la réponse de jhilgert00, nous devons également réagir aux changements d'orientation, mais maintenant en utilisantviewWillTransitionToSize
tel quelwillRotateToInterfaceOrientation
est déprécié.la source
Voici le code de travail pour Swift 3, pour avoir une disposition à deux colonnes:
N'hésitez pas à modifier "nbCol" en fonction du nombre de colonnes souhaité.
la source
Si vous êtes paresseux, utilisez Delegate.
PS: devrait également être appelé après la rotation
la source
Mis à jour vers Swift 3:
Au lieu de la disposition de flux, je préfère utiliser une disposition personnalisée pour un numéro de colonne et un numéro de ligne spécifiques. Car:
Cellule normale et cellule d'en-tête: (Ajoutez UILabel comme IBOutlet à votre xib):
Disposition personnalisée:
CollectionView:
Utilisez CollectionView à partir de ViewController:
Enfin, vous pouvez avoir de fantaisie CollectionView!
la source
En raison de sa
UICollectionView
flexibilité, il existe plusieurs façons de modifier le nombre de colonnes, selon le type de mise en page que vous utilisez.Le
UICollectionViewFlowLayout
(qui est probablement ce avec quoi vous travaillez) ne spécifie pas directement un nombre de colonnes (car cela dépend de la taille / orientation de la vue). Le moyen le plus simple de le modifier serait de définir laitemSize
propriété et / ouminimumInteritemSpacing
/minimumLineSpacing
.la source
Swift 3.0. Fonctionne pour les directions de défilement horizontales et verticales et l'espacement variable
Spécifiez le nombre de colonnes
Configurer
flowLayout
pour rendre spécifiénumberOfColumns
la source
Mise à jour vers Swift 5+ iOS 13
La taille estimée de la vue de collection doit être nulle
Déclarer la marge de la cellule
Dans viewDidLoad configure
minimumInteritemSpacing
,minimumLineSpacing
,sectionInset
Méthode UICollectionViewDataSource
sizeForItemAt
la source
Tout est question de mise en page que vous souhaitez dessiner. Vous pouvez créer une classe personnalisée héritant de UICollectionViewFlowLayout. Il n'existe actuellement aucune méthode directe pour définir les colonnes. Si vous souhaitez obtenir ce type de fonctionnalité, vous devez le faire manuellement. Vous devez le gérer dans votre classe de disposition de flux personnalisée.
Maintenant, la question se posera comment vous allez le faire? Si vous ne voulez pas déranger le cadre de la cellule, vous pouvez ajuster
Une autre façon est de vous fournir vos propres positions de cellules. En remplaçant ci-dessous deux méthodes, qui seront appelées lors de la formation de votre mise en page.
UICollectionViewLayoutAttributes est une classe qui traitera la position de la cellule, le cadre, le Zindex, etc.
la source
Cette réponse est pour Swift 3.0 ->
d'abord conforme au protocole:
puis ajoutez ces méthodes:
la source
Je voulais juste ajouter à la réponse n ° 2 d'Imanou Petit. Pour m'assurer que les marges sont exactes quelle que soit la largeur de l'écran, j'utilise un solveur itératif avec une marge souhaitée et le nombre de colonnes comme entrées. J'ai également ajouté un drapeau directionnel sur l'endroit où leurs marges finales seront comparées à leur objectif.
Le solveur itératif est illustré ci-dessous et renvoie cellWidth et margin.
Je l'appelle comme tel:
J'applique ensuite les valeurs cellWidth et margin à la disposition de flux en tant que telle:
{func collectionView (_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {return CGSize (width: cellWidth, height: cellWidth)}
}
J'espère que cela t'aides. Il existe probablement un moyen plus simple de s'assurer que les marges sont exactes, mais c'est une méthode. De plus, ce code n'a pas été testé pour les appareils qui autorisent la rotation des vues de collection.
Merci,
la source
la solution parfaite consiste à utiliser UICollectionViewDelegateFlowLayout mais vous pouvez facilement calculer la largeur de la cellule et la diviser sur le nombre de colonnes souhaité
le plus délicat est de faire la largeur sans fraction
la source
J'ai fait une mise en page de collection.
Pour rendre le séparateur visible, définissez la couleur d'arrière-plan de la vue de collection sur gris. Une ligne par section.
Utilisation:
Disposition:
la source
Essayez ceci, cela fonctionne parfaitement pour moi,
Suivez les étapes ci-dessous:
1. Définissez les valeurs dans le fichier .h.
OU
2.Ajoutez du code dans les méthodes de source de données de présentation de la collection comme ci-dessous,
J'espère que cela aidera quelqu'un.
la source
Ajoutez d'abord UICollectionViewDelegateFlowLayout comme protocole.
Ensuite:
la source