I'm programming an iOS application using multiple horizontal UICollectionViews stacked in a StackLayout inside a ScrollView. I want to display imaged in theses collection views but my custom UICollectionViewCell is not showing anything.
I've followed this tutorial for the multiple collection views, and this one for the custom cell.
Here is my ViewController :
import UIKit
struct CustomImage {
var title: String
var image: UIImage
}
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var perspectiveCV: UICollectionView!
@IBOutlet weak var monkeyCV: UICollectionView!
@IBOutlet weak var beachCV: UICollectionView!
let perspectiveImages = [
CustomImage(title: "Perspective 1", image: #imageLiteral(resourceName: "perspective-1")),
CustomImage(title: "Perspective 2", image: #imageLiteral(resourceName: "perspective-2")),
CustomImage(title: "Perspective 3", image: #imageLiteral(resourceName: "perspective-3")),
CustomImage(title: "Perspective 4", image: #imageLiteral(resourceName: "perspective-4")),
CustomImage(title: "Perspective 5", image: #imageLiteral(resourceName: "perspective-5")),
CustomImage(title: "Perspective 6", image: #imageLiteral(resourceName: "perspective-6"))
]
let monkeyImages = [
CustomImage(title: "Monkey 1", image: #imageLiteral(resourceName: "monkey-1")),
CustomImage(title: "Monkey 1", image: #imageLiteral(resourceName: "monkey-2")),
CustomImage(title: "Monkey 1", image: #imageLiteral(resourceName: "monkey-3"))
]
let beachImages = [
CustomImage(title: "Beach 1", image: #imageLiteral(resourceName: "beach-1")),
CustomImage(title: "Beach 2", image: #imageLiteral(resourceName: "beach-2")),
CustomImage(title: "Beach 3", image: #imageLiteral(resourceName: "beach-3")),
CustomImage(title: "Beach 4", image: #imageLiteral(resourceName: "beach-4"))
]
override func viewDidLoad() {
super.viewDidLoad()
title = "Images"
setupCollectionViews()
}
fileprivate func setupCollectionViews() {
// Heights
perspectiveCV.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
monkeyCV.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
beachCV.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
// Left and right padding
perspectiveCV.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
monkeyCV.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
beachCV.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
// Hide scrolling indicator
perspectiveCV.showsHorizontalScrollIndicator = false
monkeyCV.showsHorizontalScrollIndicator = false
beachCV.showsHorizontalScrollIndicator = false
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
switch collectionView {
case monkeyCV:
return monkeyImages.count
case beachCV:
return beachImages.count
default:
return perspectiveImages.count
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
switch collectionView {
case monkeyCV:
let monkeyCell = monkeyCV.dequeueReusableCell(withReuseIdentifier: "monkeyCell", for: indexPath) as! ImageCollectionViewCell
monkeyCell.backgroundColor = UIColor.systemOrange
monkeyCell.data = monkeyImages[indexPath.row]
return monkeyCell
case beachCV:
let beachCell = beachCV.dequeueReusableCell(withReuseIdentifier: "beachCell", for: indexPath) as! ImageCollectionViewCell
beachCell.backgroundColor = UIColor.systemBlue
beachCell.data = beachImages[indexPath.row]
return beachCell
default:
let perspectiveCell = perspectiveCV.dequeueReusableCell(withReuseIdentifier: "perspectiveCell", for: indexPath) as! ImageCollectionViewCell
perspectiveCell.backgroundColor = UIColor.systemRed
perspectiveCell.data = perspectiveImages[indexPath.row]
return perspectiveCell
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.frame.width * 0.8, height: collectionView.frame.width * 0.8)
}
}
Here is my custom UICollectionViewCell :
import UIKit
class ImageCollectionViewCell: UICollectionViewCell {
var data: CustomImage? {
didSet {
guard let data = data else { return }
bg.image = data.image
}
}
fileprivate let bg: UIImageView = {
let iv = UIImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.contentMode = .scaleAspectFit
iv.clipsToBounds = true
return iv
}()
override init(frame: CGRect) {
super.init(frame: frame)
bg.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
bg.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
bg.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
bg.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
contentView.addSubview(bg)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
Can you explain to me what's wrong with my code ?
My setup :
- Swift version : 5.1.3
- Xcode version : 11.3.1
- Target iOS version : 13.2
- MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports) MacOS Catalina 10.15.2 (19C57)