UICollectionView Boilerplate

Sometimes you just need some boilerplate code. And usually you need to look it up. So in order to save some time, I put together this code for a simple UICollectionView with nicely spaced cells:

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
class ViewController: UIViewController, UICollectionViewDataSource /*, UICollectionViewDelegate */ {

    let kReuseIdentifier = "CollectionCellID"
    let kNumCellsPerRow:CGFloat = 3.0
    let kSpacer:CGFloat = 10.0
    var collectionView : UICollectionView!
   
    override func viewDidLoad() {
        super.viewDidLoad()

        let cellsPerRow: CGFloat = kNumCellsPerRow
        let minItemSpacing: CGFloat = kSpacer
        let containerWidth: CGFloat = self.view.bounds.width
        let itemWidth: CGFloat = (containerWidth - (cellsPerRow+1) * minItemSpacing) / cellsPerRow - 1  // -1 in case the screen width doesn't make it easy for us
        let inset = max(minItemSpacing, floor( (containerWidth - (cellsPerRow*itemWidth) - (cellsPerRow-1)*minItemSpacing) / 2 ) )
        let layout = UICollectionViewFlowLayout()
       
        layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
        layout.minimumInteritemSpacing = minItemSpacing
        layout.minimumLineSpacing = minItemSpacing
        layout.sectionInset = UIEdgeInsets(top: minItemSpacing, left: inset, bottom: minItemSpacing, right: inset)

        self.collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout)
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: kReuseIdentifier)
        //collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = self.view.backgroundColor
       
        self.view.addSubview(collectionView)
    }
   
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20
    }
   
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kReuseIdentifier, for: indexPath as IndexPath)
        cell.backgroundColor = UIColor.lightGray
        cell.layer.cornerRadius = 3.0
        return cell
    }
}

Here is the UICollectionView gist for it.