How to set UICollectionViewCell Width and Height programmatically

后端 未结 20 1205
终归单人心
终归单人心 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:47

    swift 4.1

    You have 2 ways in order to change the size of CollectionView.
    First way -> add this protocol UICollectionViewDelegateFlowLayout
    for In my case I want to divided cell into 3 part in one line. I did this code below

    extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource ,UICollectionViewDelegateFlowLayout{
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
        {
                // In this function is the code you must implement to your code project if you want to change size of Collection view
                let width  = (view.frame.width-20)/3
                return CGSize(width: width, height: width)
        }
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return collectionData.count
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
            if let label = cell.viewWithTag(100) as? UILabel {
                label.text = collectionData[indexPath.row]
            }
            return cell
        }
    }
    

    Second way -> you don't have to add UICollectionViewDelegateFlowLayout but you have to write some code in viewDidload function instead as code below

    class ViewController: UIViewController {
    @IBOutlet weak var collectionView1: UICollectionView!
            var collectionData = ["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."]
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let width = (view.frame.width-20)/3
            let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
            layout.itemSize = CGSize(width: width, height: width) 
        }
    }
    


    extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return collectionData.count
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
            if let label = cell.viewWithTag(100) as? UILabel {
                label.text = collectionData[indexPath.row]
            }
    
            return cell
        }
    }
    

    Whatever you write a code as the first way or second way you will get the same result as above. I wrote it. It worked for me

提交回复
热议问题