numberOfItemsInSection

numberOfItemsInSection

以下是我的代码,如果numberOfItemsInSection大于1,工作正常,但是如果numberOfItemsInSection等于1,则它应该显示单个单元格,但不会发生,因为numberOfItemsInSection等于1,但不调用cellForItemAt

同样,在进行api调用并接收数据后,初始numberOfItemsInSection为零,我也调用以下代码

tabsCollectionView.reloadData()

其他代码
    tabsCollectionView.delegate = self
    tabsCollectionView.dataSource = self




func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return menuResult?.foodMenuItems?.count ?? 0
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = tabsCollectionView.dequeueReusableCell(withReuseIdentifier: "foodTabsCollectionViewCellID", for: indexPath) as! FoodTabsCollectionViewCell
    cell.foodMenuItem = menuResult?.foodMenuItems?[indexPath.row]
    cell.setUI()
    return cell
}


func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1

}

以下代码与侧视图viewDidLoad()中的大小相关
 if let flowLayout = tabsCollectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        flowLayout.estimatedItemSize = CGSize(width: 200, height: 70)
        flowLayout.itemSize = UICollectionViewFlowLayout.automaticSize
        tabsCollectionView.collectionViewLayout = flowLayout
    }

sizeForItemAt方法
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    var height = collectionView.frame.height
    var width  = collectionView.frame.width
    if let flowLayout  = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        width = flowLayout.estimatedItemSize.width
        height = flowLayout.estimatedItemSize.height
    }

    return CGSize(width: width, height: height)
}

以下是FoodTabsCollectionViewCell内部的代码
 override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    setNeedsLayout()
    layoutIfNeeded()
    let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
    var frame = layoutAttributes.frame
    frame.size.width = ceil(size.width)
    frame.size.height = ceil(size.height)
    layoutAttributes.frame = frame
    layoutIfNeeded()
    return layoutAttributes
}

最佳答案

当我尝试为包含可变宽度的UILabel的单元格设置灵活宽度时,我遇到了同样的问题(实际上,大小与UILabel文本的宽度有关)
所以最初我使用的是这种方法(这是造成问题的原因):

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize <--- THIS
layout.itemSize.height = 70 <-- THIS
然后,我删除了automaticSize(和itemSize.height),如下所示:
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
而且有效。
为了确保单元格宽度灵活,我使用了以下方法:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let dummyCell = MyCell(frame: .init(x: 0, y: 0, width: frame.width, height: 40))


    dummyCell.name = users[indexPath.item].name

    // 3. Force the view to update its layout
    dummyCell.layoutIfNeeded()

    // 4. Calculate the estimated size
    let estimatedSize = dummyCell.systemLayoutSizeFitting(.init(width: frame.width, height: 40))

    return CGSize(width: estimatedSize.width, height: 40)
}

10-08 05:58