从未调用CollectionView sizeForItemAtIndexPath

joh*_*doe 76 ios

这真让我抓狂!我有一个UICollectionViewController,如下所示:

class PhrasesCompactCollectionViewController: UICollectionViewController
Run Code Online (Sandbox Code Playgroud)

正在调用numberOfSections和cellForItemAt,但从不调用sizeForItemAtIndexPath.我在其他地方使用相同的确切代码,它正确触发.我正在使用Xcode 8 Beta 6.

func collectionView(collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAtIndexPath indexPath:  NSIndexPath) -> CGSize {

        return CGSize(width: 120, height:120) 
    }
Run Code Online (Sandbox Code Playgroud)

alm*_*mas 221

您需要指定UICollectionViewDelegateFlowLayout在类声明中实现协议.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  • 我做了这个,但它仍然没有被调用.:( (6认同)

Shi*_*mar 49

Swift 3+中使用此方法:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}
Run Code Online (Sandbox Code Playgroud)

确保您的班级符合两个代表

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout

  • 如UICollectionViewController已经做的那样,遵守`UICollectionViewDelegate`是多余的. (4认同)
  • @VanDuTran声明它是必需的,因为不需要UICollectionViewController是多余的... (2认同)

Xys*_*Xys 24

斯威夫特 5

所有这些步骤都是必需的

  1. 符合UICollectionViewDelegateFlowLayout <== 绝对需要!!
  2. UICollectionViewDelegate, UICollectionViewDataSource
  3. 在 viewDidLoad 中设置这些:collectionView.delegate = selfcollectionView.dataSource = self
  4. 在 Interface Builder 中将Estimate Size设置为 None
  5. 确保以下方法具有sizeForItemAt而不是sizeForItemAtIndexPath

作为 :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    return CGSize(width: 100, height:100)
} 
Run Code Online (Sandbox Code Playgroud)

  • 估计尺寸为无 - 拯救我的日子! (7认同)

Gau*_*ami 14

斯威夫特3

要设置UICollectionView的Cell Size,您需要创建和自定义对象UICollectionViewFlowLayout.自定义属性并将该布局对象设置为UICollectionView对象.

根据您的要求(您想要的单元格高度和宽度)更改cellheight和cell cellWidth对象.

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()
}
Run Code Online (Sandbox Code Playgroud)

确定:如果你添加了sizeForItemAt indexPath方法,那么必须删除方法...

删除下面的方法

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

}
Run Code Online (Sandbox Code Playgroud)

  • 这有什么用? (8认同)
  • 这仅适用于所有单元格大小相同的情况.以下答案是正确的答案 (2认同)

Zen*_*n C 9

我有同样的问题。帮助我的一件事是在collectionView大小检查器“无”下为单元格大小设置了“估计大小”。

在此处输入图片说明

  • 你救了我的命,伙计,你是英雄 (13认同)

Man*_*ish 7

如果没有答案,您需要检查三件事:

  1. 实现 FlowLayout 委托: class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  2. 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. 选择Estimate size = None在检查UICollectionView的元素。


H S*_*ogr 5

第一类需要确认到UICollectionViewDelegateFlowLayout。然后,您需要在viewDidLoad()中编写以下代码:

//告诉UICollectionView使用UIViewController的UICollectionViewDelegateFlowLayout方法

collectionView.delegate = self
Run Code Online (Sandbox Code Playgroud)

//如果要设置自己的收藏视图流布局

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)
Run Code Online (Sandbox Code Playgroud)

通过使用此代码,UICollectionViewDelegateFlowLayout方法

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
Run Code Online (Sandbox Code Playgroud)

将被调用,您可以在此方法中设置大小。