Questo progetto è stato testato con Xcode 10 e Swift 4.2.
Crea un nuovo progetto
Può essere solo un'app a visualizzazione singola.
Aggiungi il codice
Crea un nuovo file Cocoa Touch Class (File> Nuovo> File ...> iOS> Cocoa Touch Class). Dillo MyCollectionViewCell
. Questa classe conterrà gli sbocchi per le visualizzazioni che aggiungi alla tua cella nello storyboard.
import UIKit
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var myLabel: UILabel!
}
Collegheremo questa presa più tardi.
Apri ViewController.swift e assicurati di avere il seguente contenuto:
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
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"]
// MARK: - UICollectionViewDataSource protocol
// tell the collection view how many cells to make
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.items.count
}
// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// get a reference to our storyboard cell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
// Use the outlet in our custom class to get a reference to the UILabel in the cell
cell.myLabel.text = self.items[indexPath.item]
cell.backgroundColor = UIColor.cyan // make cell more visible in our example project
return cell
}
// MARK: - UICollectionViewDelegate protocol
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// handle tap events
print("You selected cell #\(indexPath.item)!")
}
}
Appunti
UICollectionViewDataSource
e UICollectionViewDelegate
sono i protocolli che segue la vista della raccolta. È inoltre possibile aggiungere il UICollectionViewFlowLayout
protocollo per modificare le dimensioni delle visualizzazioni a livello di codice, ma non è necessario.
- Stiamo semplicemente inserendo semplici stringhe nella nostra griglia, ma potresti sicuramente fare immagini in seguito.
Imposta lo storyboard
Trascina una vista raccolta sul controller di visualizzazione nello storyboard. Se lo desideri, puoi aggiungere vincoli per riempire la vista padre.
Assicurati che anche le impostazioni predefinite nella finestra di ispezione degli attributi lo siano
- Articoli: 1
- Layout: flusso
La piccola casella in alto a sinistra nella vista Raccolta è una cella della vista Raccolta. Lo useremo come nostra cellula prototipo. Trascina un'etichetta nella cella e centrala. Puoi ridimensionare i bordi delle celle e aggiungere vincoli per centrare l'etichetta, se lo desideri.
Scrivi "cella" (senza virgolette) nella casella Identificatore della finestra di ispezione degli attributi per la vista della raccolta. Si noti che questo è lo stesso valore let reuseIdentifier = "cell"
di ViewController.swift.
E in Identity Inspector per la cella, imposta il nome della classe su MyCollectionViewCell
, la nostra classe personalizzata che abbiamo creato.
Agganciare le prese
- Agganciare l'etichetta nella cella di raccolta
myLabel
nella MyCollectionViewCell
classe. (Puoi trascinare Control .)
- Agganciare la vista raccolta
delegate
e dataSource
al controller vista. (Fare clic con il pulsante destro del mouse su Vista raccolta nella struttura del documento. Quindi fare clic e trascinare la freccia più verso l'alto su Visualizza controller.)
Finito
Ecco come appare dopo aver aggiunto i vincoli per centrare l'etichetta nella cella e appuntare la Vista raccolta ai muri del genitore.
Miglioramenti
L'esempio sopra funziona ma è piuttosto brutto. Ecco alcune cose con cui puoi giocare:
Colore di sfondo
In Interface Builder, vai alla vista Collezione> Impostazioni Attributi> Visualizza> Sfondo .
Spaziatura cellulare
La modifica della spaziatura minima tra le celle su un valore più piccolo la rende migliore. In Interface Builder, vai alla vista Collezione> Impostazioni dimensioni> Spaziatura minima e riduci i valori. "Per celle" è la distanza orizzontale e "Per linee" è la distanza verticale.
Forma cellulare
Se vuoi angoli arrotondati, un bordo e simili, puoi giocare con la cella layer
. Ecco qualche codice di esempio. Lo inseriresti direttamente dopo cell.backgroundColor = UIColor.cyan
nel codice sopra.
cell.layer.borderColor = UIColor.black.cgColor
cell.layer.borderWidth = 1
cell.layer.cornerRadius = 8
Vedi questa risposta per altre cose che puoi fare con il livello (ombra, per esempio).
Cambiare colore quando toccato
Offre un'esperienza utente migliore quando le celle rispondono visivamente ai tocchi. Un modo per raggiungere questo obiettivo è cambiare il colore di sfondo mentre la cella viene toccata. Per fare ciò, aggiungi i seguenti due metodi alla tua ViewController
classe:
// change background color when user touches cell
func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.red
}
// change background color back when user releases touch
func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.cyan
}
Ecco l'aspetto aggiornato:
Ulteriore studio
Versione UITableView di queste domande e risposte