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:
Conform to the
UICollectionViewDelegateFlowLayout
protocol.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:
- add
_
beforecollectionView
in the method name NSIndexPath
changes toIndexPath
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()}