How to change UICollectionViewCell size programmatically in Swift? How to change UICollectionViewCell size programmatically in Swift? ios ios

How to change UICollectionViewCell size programmatically in Swift?


Make sure you conform to UICollectionViewDelegateFlowLayout for your class(for swift4)

eg. class MyClass: UICollectionViewDelegateFlowLayout

Prior to Swift 3

//Use for sizefunc collectionView(collectionView: UICollectionView,        layout collectionViewLayout: UICollectionViewLayout,        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {    }//Use for interspacing    func collectionView(collectionView: UICollectionView,        layout collectionViewLayout: UICollectionViewLayout,        minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {            return 1.0    }    func collectionView(collectionView: UICollectionView, layout        collectionViewLayout: UICollectionViewLayout,        minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {            return 1.0    }

// For swift 3

func collectionView(_ collectionView: UICollectionView,                    layout collectionViewLayout: UICollectionViewLayout,                    sizeForItemAt indexPath: IndexPath) -> CGSize {}func collectionView(_ collectionView: UICollectionView,                    layout collectionViewLayout: UICollectionViewLayout,                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {    return 1.0}func collectionView(_ collectionView: UICollectionView, layout    collectionViewLayout: UICollectionViewLayout,                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {    return 1.0}

// For swift 4

extension MyClass: UICollectionViewDelegateFlowLayout {         func collectionView(_ collectionView: UICollectionView,                            layout collectionViewLayout: UICollectionViewLayout,                            sizeForItemAt indexPath: IndexPath) -> CGSize {        }        func collectionView(_ collectionView: UICollectionView,                            layout collectionViewLayout: UICollectionViewLayout,                            minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {            return 1.0        }        func collectionView(_ collectionView: UICollectionView, layout            collectionViewLayout: UICollectionViewLayout,                            minimumLineSpacingForSectionAt section: Int) -> CGFloat {            return 1.0        }    }

use the same code as shown above for swift 3 but just make sureyour class conforms to protocol UICollectionViewDelegateFlowLayout


Swift 3

Methods from @sumit-oberoi answer won't be called if you are using Swift 3. To make it work make this adjustments:

  1. Conform to the UICollectionViewDelegateFlowLayout protocol.

  2. Implement these methods:

    func collectionView(_ collectionView: UICollectionView,                    layout collectionViewLayout: UICollectionViewLayout,                    sizeForItemAt indexPath: IndexPath) -> CGSize {}func collectionView(_ collectionView: UICollectionView,                    layout collectionViewLayout: UICollectionViewLayout,                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {    return 1.0}func collectionView(_ collectionView: UICollectionView, layout    collectionViewLayout: UICollectionViewLayout,                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {    return 1.0}

Notice the changes:

  1. add _ before collectionView in the method name
  2. NSIndexPath changes to IndexPath


Swift 3

override func viewDidLoad() {    super.viewDidLoad()    let cellSize = CGSize(width:80 , height:80)    let layout = UICollectionViewFlowLayout()    layout.scrollDirection = .vertical //.horizontal    layout.itemSize = cellSize    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)    layout.minimumLineSpacing = 1.0    layout.minimumInteritemSpacing = 1.0    myCollectionView.setCollectionViewLayout(layout, animated: true)    myCollectionView.reloadData()}