UICollectionView knowledge supply and delegates programmatically

UICollectionView knowledge supply and delegates programmatically



· 1 min learn


On this fast UIKit tutorial I am going to present you learn how to create a easy UICollectionView with out Interface Builder, however solely utilizing Swift.

UICollectionViewCell programmatically

Should you’d like so as to add views to your cell, it’s best to use the init(body:) methodology, and arrange your view hierarchy there. As a substitute of awakeFromNib it’s best to fashion your views within the init methodology as nicely. You possibly can reset the whole lot inside the same old prepareForReuse methodology. As you’ll be able to see by utilizing anchors generally it’s value to ditch IB completely. 🎉

class Cell: UICollectionViewCell {

    static var identifier: String = "Cell"

    weak var textLabel: UILabel!

    override init(body: CGRect) {
        tremendous.init(body: body)

        let textLabel = UILabel(body: .zero)
        textLabel.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(textLabel)
        NSLayoutConstraint.activate([
            contentView.centerXAnchor.constraint(equalTo: textLabel.centerXAnchor),
            contentView.centerYAnchor.constraint(equalTo: textLabel.centerYAnchor),
        ])
        self.textLabel = textLabel
        reset()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been applied")
    }

    override func prepareForReuse() {
        tremendous.prepareForReuse()
        
        reset()
    }

    func reset() {
        textLabel.textAlignment = .heart
    }
}

UICollectionView programmatically

Creating assortment view controllers utilizing solely Swift code requires just a few extra strains. You possibly can implement loadView and create your UICollectionView object there. Retailer a weak reference of it contained in the controller, and the remainder is identical.

class ViewController: UIViewController {

    weak var collectionView: UICollectionView!

    var knowledge: [Int] = Array(0..<10)

    override func loadView() {
        tremendous.loadView()

        let collectionView = UICollectionView(
            body: .zero, 
            collectionViewLayout: UICollectionViewFlowLayout()
        )
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(collectionView)
        NSLayoutConstraint.activate([
            view.topAnchor.constraint(equalTo: collectionView.topAnchor),
            view.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor),
            view.leadingAnchor.constraint(equalTo: collectionView.leadingAnchor),
            view.trailingAnchor.constraint(equalTo: collectionView.trailingAnchor),
        ])
        collectionView = collectionView
    }

    override func viewDidLoad() {
        tremendous.viewDidLoad()

        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.register(Cell.self, forCellWithReuseIdentifier: Cell.identifier)
        collectionView.alwaysBounceVertical = true
        collectionView.backgroundColor = .white
    }
}

extension ViewController: UICollectionViewDataSource {

    func collectionView(
        _ collectionView: UICollectionView,
        numberOfItemsInSection part: Int
    ) -> Int {
        knowledge.rely
    }

    func collectionView(
        _ collectionView: UICollectionView,
        cellForItemAt indexPath: IndexPath
    ) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(
            withReuseIdentifier: Cell.identifier, 
            for: indexPath
        ) as! Cell

        let knowledge = knowledge[indexPath.item]
        cell.textLabel.textual content = String(knowledge)
        return cell
    }
}

extension ViewController: UICollectionViewDelegate {

    func collectionView(
        _ collectionView: UICollectionView, 
        didSelectItemAt indexPath: IndexPath
    ) {

    }
}

extension ViewController: UICollectionViewDelegateFlowLayout {

    func collectionView(
        _ collectionView: UICollectionView,
        format collectionViewLayout: UICollectionViewLayout,
        sizeForItemAt indexPath: IndexPath
    ) -> CGSize {
        .init(width: collectionView.bounds.width, peak: 44)
    }

    func collectionView(
        _ collectionView: UICollectionView,
        format collectionViewLayout: UICollectionViewLayout,
        insetForSectionAt part: Int
    ) -> UIEdgeInsets {
        .init(high: 0, left: 0, backside: 0, proper: 0) //.zero
    }

    func collectionView(
        _ collectionView: UICollectionView,
        format collectionViewLayout: UICollectionViewLayout,
        minimumInteritemSpacingForSectionAt part: Int
    ) -> CGFloat {
        0
    }

    func collectionView(
        _ collectionView: UICollectionView,
        format collectionViewLayout: UICollectionViewLayout,
        minimumLineSpacingForSectionAt part: Int
    ) -> CGFloat {
        0
    }
}

That was simple. Anchors are actually highly effective, Interface Builder is extraordinarily useful, however generally it’s simply quicker to create your views from code. The selection is yours, however please don’t be afraid of coding consumer interfaces! 😅

Associated posts


· 8 min learn


On this article I’ve gathered my high 10 favourite fashionable UIKit suggestions that I would positively wish to know earlier than I begin my subsequent undertaking.


· 5 min learn


Learn to construct advanced types with my up to date assortment view view-model framework with out the wrestle utilizing Swift.


· 5 min learn


Do you wish to learn to load a xib file to create a customized view object? Properly, this UIKit tutorial is only for you written in Swift.


· 4 min learn


Just a bit recommendation about creating customized view programmatically and the reality about why kind constructing with assortment views sucks.

author avatar
roosho Senior Engineer (Technical Services)
I am Rakib Raihan RooSho, Jack of all IT Trades. You got it right. Good for nothing. I try a lot of things and fail more than that. That's how I learn. Whenever I succeed, I note that in my cookbook. Eventually, that became my blog. 
rooshohttps://www.roosho.com
I am Rakib Raihan RooSho, Jack of all IT Trades. You got it right. Good for nothing. I try a lot of things and fail more than that. That's how I learn. Whenever I succeed, I note that in my cookbook. Eventually, that became my blog. 

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here


Latest Articles

author avatar
roosho Senior Engineer (Technical Services)
I am Rakib Raihan RooSho, Jack of all IT Trades. You got it right. Good for nothing. I try a lot of things and fail more than that. That's how I learn. Whenever I succeed, I note that in my cookbook. Eventually, that became my blog.