How to set UICollectionViewCell Width and Height programmatically

后端 未结 20 1034
终归单人心
终归单人心 2020-12-04 08:06

I am trying to implement a CollectionView. When I am using Autolayout, my cells won\'t change the size, but their alignment.

Now I would rather want to

相关标签:
20条回答
  • 2020-12-04 08:54

    An other way is to set the value directly in the flow layout

        let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width: size, height: size)
    
    0 讨论(0)
  • 2020-12-04 08:56

    swift4 swift 4 ios collection view collectionview example xcode latest code working sample

    Add this on Delegate section of the top

    UICollectionViewDelegateFlowLayout

    and use this function

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let width = (self.view.frame.size.width - 20) / 3 //some width
        let height = width * 1.5 //ratio
        return CGSize(width: width, height: height)
    }
    

    ///// sample complete code

    create on collection view and collectionview cell in storyboard give reference to the collection as
    @IBOutlet weak var cvContent: UICollectionView!

    paste this in View controller

     import UIKit
    
    class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    
        var arrVeg = [String]()
        var arrFruits = [String]()
        var arrCurrent = [String]()
        
        @IBOutlet weak var cvContent: UICollectionView!
        
      
        
        override func viewDidLoad() {
            super.viewDidLoad()
            arrVeg = ["Carrot","Potato", "Tomato","Carrot","Potato", "Tomato","Carrot","Potato", "Tomato","Carrot","Potato", "Tomato"]
            
            arrVeg = ["Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange"]
            
            
            arrCurrent = arrVeg
        }
        //MARK: - CollectionView
        
    
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let width = (self.view.frame.size.width - 20) / 3 //some width
            let height = width * 1.5 //ratio
            return CGSize(width: width, height: height)
        }
        
        func numberOfSections(in collectionView: UICollectionView) -> Int {
    
            return 1
        }
        
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            
            
            return arrCurrent.count
        }
        
        
        
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ContentCollectionViewCell
            cell.backgroundColor =  UIColor.green
            return cell
        }
    }
    
    0 讨论(0)
  • 2020-12-04 08:58

    Finally got the answer. You should extend UICollectionViewDelegateFlowLayout
    This should be working with answers above.

    0 讨论(0)
  • 2020-12-04 08:58

    Swift 5 Programmatically

    lazy var collectionView: UICollectionView = {
            let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .horizontal
    
            //Provide Width and Height According to your need
            let cellWidth = UIScreen.main.bounds.width / 10
            let cellHeight = UIScreen.main.bounds.height / 10
            layout.itemSize = CGSize(width: cellWidth, height: cellHeight)
    
            //You can also provide estimated Height and Width
            layout.estimatedItemSize = CGSize(width: cellWidth, height: cellHeight)
    
            //For Setting the Spacing between cells
            layout.minimumInteritemSpacing = 0
            layout.minimumLineSpacing = 0
    
            return UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
        }()
    
    0 讨论(0)
  • 2020-12-04 08:59

    So you need to setting from storyboard for attribute for collectionView in cell section estimate Size to none, and in your ViewController you need had delegate method for implementing this method : optional func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

    0 讨论(0)
  • 2020-12-04 09:01

    Use this method to set custom cell height width.

    Make sure to add this protocols

    UICollectionViewDelegate
    
    UICollectionViewDataSource
    
    UICollectionViewDelegateFlowLayout
    

    If you are using swift 5 or xcode 11 and later you need to set Estimate Size to none using storyboard in order to make it work properly. If you will not set that than below code will not work as expected.

    Swift 4 or Later

    extension YourViewController: UICollectionViewDelegate {
        //Write Delegate Code Here
    }
    
    extension YourViewController: UICollectionViewDataSource {
        //Write DataSource Code Here
    }
    
    extension YourViewController: UICollectionViewDelegateFlowLayout {
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: screenWidth, height: screenWidth)
        }
    }
    

    Objective-C

    @interface YourViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
    
    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        return CGSizeMake(CGRectGetWidth(collectionView.frame), (CGRectGetHeight(collectionView.frame)));
    }
    
    0 讨论(0)
提交回复
热议问题