Ce projet a été testé avec Xcode 10 et Swift 4.2.
Créer un nouveau projet
Il peut s'agir simplement d'une application à vue unique.
Ajouter le code
Créez un nouveau fichier Cocoa Touch Class (Fichier> Nouveau> Fichier ...> iOS> Cocoa Touch Class). Nommez-le MyCollectionViewCell
. Cette classe contiendra les sorties pour les vues que vous ajoutez à votre cellule dans le storyboard.
import UIKit
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var myLabel: UILabel!
}
Nous connecterons cette prise plus tard.
Ouvrez ViewController.swift et assurez-vous que vous disposez du contenu suivant:
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
let reuseIdentifier = "cell"
var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"]
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
cell.myLabel.text = self.items[indexPath.row]
cell.backgroundColor = UIColor.cyan
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.item)!")
}
}
Remarques
UICollectionViewDataSource
et UICollectionViewDelegate
sont les protocoles que la vue de collection suit. Vous pouvez également ajouter le UICollectionViewFlowLayout
protocole pour modifier la taille des vues par programme, mais ce n'est pas nécessaire.
- Nous mettons juste des chaînes simples dans notre grille, mais vous pourrez certainement faire des images plus tard.
Configurer le storyboard
Faites glisser une vue de collection vers le contrôleur de vue de votre storyboard. Vous pouvez ajouter des contraintes pour qu'elle remplisse la vue parente si vous le souhaitez.
Assurez-vous que vos valeurs par défaut dans l'inspecteur d'attributs sont également
- Articles: 1
- Disposition: Flow
La petite boîte en haut à gauche de la vue de collection est une cellule de vue de collection. Nous l'utiliserons comme cellule prototype. Faites glisser une étiquette dans la cellule et centrez-la. Vous pouvez redimensionner les bordures de cellule et ajouter des contraintes pour centrer l'étiquette si vous le souhaitez.
Écrivez «cellule» (sans guillemets) dans la zone Identifiant de l'inspecteur d'attributs pour la cellule de vue de collection. Notez qu'il s'agit de la même valeur que let reuseIdentifier = "cell"
dans ViewController.swift.
Et dans l'inspecteur d'identité de la cellule, définissez le nom de la classe sur MyCollectionViewCell
, notre classe personnalisée que nous avons créée .
Branchez les prises
- Accrochez l'étiquette de la cellule de collection à
myLabel
la MyCollectionViewCell
classe. (Vous pouvez Ctrl-faire glisser .)
- Accrochez la vue de collection
delegate
et dataSource
le contrôleur de vue. (Cliquez avec le bouton droit de la souris sur Vue de collection dans la structure du document. Ensuite, cliquez et faites glisser la flèche plus vers le haut vers le contrôleur de vue.)
Fini
Voici à quoi cela ressemble après avoir ajouté des contraintes pour centrer l'étiquette dans la cellule et épingler la vue de collection aux murs du parent.
Faire des améliorations
L'exemple ci-dessus fonctionne mais il est plutôt moche. Voici quelques éléments avec lesquels vous pouvez jouer:
Couleur de l'arrière plan
Dans l'Interface Builder, accédez à la vue de votre collection> Inspecteur d'attributs> Vue> Arrière-plan .
Espacement des cellules
La modification de l'espacement minimum entre les cellules à une valeur plus petite lui donne une meilleure apparence. Dans le générateur d'interface, accédez à votre vue de collection> Inspecteur de taille> Espacement minimum et réduisez les valeurs. «Pour les cellules» est la distance horizontale et «Pour les lignes» est la distance verticale.
Forme de cellule
Si vous voulez des coins arrondis, une bordure, etc., vous pouvez jouer avec la cellule layer
. Voici un exemple de code. Vous le mettriez directement après cell.backgroundColor = UIColor.cyan
dans le code ci-dessus.
cell.layer.borderColor = UIColor.black.cgColor
cell.layer.borderWidth = 1
cell.layer.cornerRadius = 8
Voir cette réponse pour d'autres choses que vous pouvez faire avec le calque (ombre, par exemple).
Changer la couleur lorsque vous appuyez sur
Cela permet une meilleure expérience utilisateur lorsque les cellules répondent visuellement aux pressions. Une façon d'y parvenir est de changer la couleur d'arrière-plan pendant que la cellule est touchée. Pour ce faire, ajoutez les deux méthodes suivantes à votre ViewController
classe:
func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.red
}
func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.cyan
}
Voici le look mis à jour:
Une étude plus approfondie
Version UITableView de ce Q&R
@IBOutlet
formyLabel
in, vous obtiendrez un plantage comme celui-ci.self.collectionView.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
. Si vous rencontrez toujours le problème, vérifiez s'ilreuseIdentifier
s'agit de la même chose dansdequeueReusableCellWithReuseIdentifier
et dans le storyboardDélégués et sources de données de UICollectionView
//MARK: UICollectionViewDataSource override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 //return number of sections in collection view } override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 //return number of rows in section } override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("collectionCell", forIndexPath: indexPath) configureCell(cell, forItemAtIndexPath: indexPath) return cell //return your cell } func configureCell(cell: UICollectionViewCell, forItemAtIndexPath: NSIndexPath) { cell.backgroundColor = UIColor.blackColor() //Customise your cell } override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { let view = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "collectionCell", forIndexPath: indexPath) as UICollectionReusableView return view } //MARK: UICollectionViewDelegate override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { // When user selects the cell } override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { // When user deselects the cell }
la source
Pour
swift 4.2
-//MARK: UICollectionViewDataSource func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 //return number of sections in collection view } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 //return number of rows in section } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath) configureCell(cell: cell, forItemAtIndexPath: indexPath) return cell //return your cell } func configureCell(cell: UICollectionViewCell, forItemAtIndexPath: NSIndexPath) { cell.backgroundColor = UIColor.black //Customise your cell } func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { let view = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "collectionCell", for: indexPath as IndexPath) as UICollectionReusableView return view } //MARK: UICollectionViewDelegate func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { // When user selects the cell } func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { // When user deselects the cell }
la source
L'implémentation d'UICollectionView est assez intéressante. Vous pouvez utiliser le code source simple et regarder un didacticiel vidéo en utilisant ces liens:
https://github.com/Ady901/Demo02CollectionView.git
https://www.youtube.com/watch?v=5SrgvZF67Yw
extension ViewController : UICollectionViewDataSource { func numberOfSections(in collectionView: UICollectionView) -> Int { return 2 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return nameArr.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DummyCollectionCell", for: indexPath) as! DummyCollectionCell cell.titleLabel.text = nameArr[indexPath.row] cell.userImageView.backgroundColor = .blue return cell } } extension ViewController : UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let alert = UIAlertController(title: "Hi", message: "\(nameArr[indexPath.row])", preferredStyle: .alert) let action = UIAlertAction(title: "OK", style: .default, handler: nil) alert.addAction(action) self.present(alert, animated: true, completion: nil) } }
la source
UICollectionView est identique à UITableView mais il nous donne la fonctionnalité supplémentaire de créer simplement une vue de grille, ce qui est un peu problématique dans UITableView. Ce sera un très long post, je mentionne un lien à partir duquel vous obtiendrez tout en quelques étapes simples.
la source