CollectionView sizeForItemAtIndexPath never called

前端 未结 15 1264
一整个雨季
一整个雨季 2020-12-24 11:17

This is driving me crazy! I have a UICollectionViewController as shown below:

class PhrasesCompactCollectionViewController: UICollectionViewController


        
相关标签:
15条回答
  • 2020-12-24 11:52

    Swift 3

    To set Cell Size of UICollectionView, you need to create and customise object of UICollectionViewFlowLayout. Customise the properties and set that layout object to the UICollectionView object.

    Change cellheight and cell cellWidth objects according to your requirement (the cell hight and width you want).

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
        let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
        let cellSize = CGSize(width: cellWidth , height:cellheight)
    
        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()
    }
    

    Make Sure: if you added sizeForItemAt indexPath method then must REMOVE the method...

    Remove Below Method

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    
    }
    
    0 讨论(0)
  • 2020-12-24 11:52

    Make sure you put this in viewDidLoad()

    collectionView.delegate = self
    
    0 讨论(0)
  • 2020-12-24 11:55

    I had the same problem. The one thing that helped me was to make the 'Estimated Size' for the Cell Size under the collectionView size inspector 'None'.

    0 讨论(0)
  • 2020-12-24 11:57

    Swift 5

    All these steps are required :

    1. Conform to UICollectionViewDelegateFlowLayout <== Absolutely needed !!
    2. and to UICollectionViewDelegate, UICollectionViewDataSource
    3. Set these in viewDidLoad : collectionView.delegate = self and collectionView.dataSource = self
    4. Set Estimate Size to None in the Interface Builder
    5. Make sure the following method has sizeForItemAt and not sizeForItemAtIndexPath

    as :

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
        return CGSize(width: 100, height:100)
    } 
    
    0 讨论(0)
  • 2020-12-24 11:57

    Three things you need to check if no answer works:

    1. Implement FlowLayout Delegate : class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

    2. Use method for size of item for swift 3.0+: func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }

    3. Select Estimate size = None in Inspect element of UICollectionView.

    0 讨论(0)
  • 2020-12-24 12:03

    I had the same problem and nothing would fix it. I had a yellow warning saying to make it private because it came close to another function defined by the Layout Delegate. What fixed it for me was:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    

    Notice the difference from "sizeForItemAtIndexPath" to the correct "sizeForItemAt".

    I tore my hair out for days trying to figure this out and it finally worked. Below I will include all of my function to show you how I also "hid" a cell by making the height equal to 0.

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])")
        let screenSize = UIScreen.main.bounds
        let screenWidth = screenSize.width
    
        if (findIndex! % 2 == 0){
            // Even index, show cell
            return CGSize(width: screenWidth, height: 246)
        }
        else {
            return CGSize(width: screenWidth, height: 0)
        }
    }
    
    0 讨论(0)
提交回复
热议问题