Ios 访问layout.collectionViewContentSize时collectionView(uux0:layout:sizeForItemAt:)中出现异常

Ios 访问layout.collectionViewContentSize时collectionView(uux0:layout:sizeForItemAt:)中出现异常,ios,swift,exception,uicollectionviewlayout,uicollectionviewdelegateflowlayout,Ios,Swift,Exception,Uicollectionviewlayout,Uicollectionviewdelegateflowlayout,实现 我希望在UICollectionView中有两种不同的项目大小。因此我实施了 属于UICollectionViewDelegateFlowLayout 错误 但我面临的问题是,每当我在这个函数中访问collectionViewLayout.collectionViewContentSize时,我的应用程序就会出现异常崩溃 例外情况如下: *由于未捕获的异常“NSRangeException”而终止应用程序,原因:'*-[\uu NSArrayM objectAtIndexedSubscri

实现

我希望在
UICollectionView
中有两种不同的项目大小。因此我实施了

属于
UICollectionViewDelegateFlowLayout

错误 但我面临的问题是,每当我在这个函数中访问
collectionViewLayout.collectionViewContentSize
时,我的应用程序就会出现异常崩溃

例外情况如下:

*由于未捕获的异常“NSRangeException”而终止应用程序,原因:'*-[\uu NSArrayM objectAtIndexedSubscript:]:索引1超出边界[0..0]'

抛出调用堆栈位于文章的底部

这似乎是SDK的内部问题,可能是初始化不正确

问题: 谁能证实这个错误,或者告诉我我做错了什么

实施 以下是我对
UICollectionViewDelegateFlowLayout
的实现:

class TwoSizesCellFlowLayout: NSObject, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let layoutSize = collectionViewLayout.collectionViewContentSize // CRASHES when accessing `collectionViewContentSize`
        // SDK error?
        let layoutSize = collectionView.contentSize // works but results in slightly different size
        var size = layoutSize.width / 2

        if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {
            size = size - flowLayout.minimumInteritemSpacing / 2
        }
        return CGSize(width: size, height: size)
    }
}
在集合视图控制器子类中,我将
TwoSizeCellFlowLayout
的对象分配给
UICollectionViewController
delegate
属性:

class ViewController: UICollectionViewController {

    ...

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        collectionView?.dataSource = self
        collectionView?.delegate = collectionViewDelegateAndLayout

        let nib = UINib.init(nibName: "BasicCollectionViewCell", bundle: nil)
        collectionView?.register(nib, forCellWithReuseIdentifier: cellIdentifier)

        // accessing `collectionViewContentSize` here works like a charm, but only one size for all items is possible
//        let collectionViewSize = collectionView?.collectionViewLayout.collectionViewContentSize
//        if let collectionSize = collectionViewSize, let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
//            let size = collectionSize.width / 2 - flowLayout.minimumInteritemSpacing / 2
//            let cellSize = CGSize(width: size, height: size)
//            flowLayout.itemSize = cellSize
//        }
    }

    ...

}
第一次抛出调用堆栈: 问候,

亚伦

问题解决了

我认为问题在于调用了
collectionView(uuu:layout:sizeForItemAt:)
来确定
collectionViewContentSize
属性。 但是我试图访问它里面的
collectionViewContentSize

我使用
collectionView
bounds
修复了它

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let viewSize = collectionView.bounds.size
    var cellWidth = viewSize.width / 2

    if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {
        let usableViewWidth = viewSize.width - flowLayout.sectionInset.left - flowLayout.sectionInset.right
        cellWidth = usableViewWidth / 2 - flowLayout.minimumInteritemSpacing / 2
    }
    return CGSize(width: cellWidth, height: cellWidth)
}

您需要在“集合”视图中使用自定义流布局。看到这个谢谢你的回复。不需要自定义布局。看看我贴的答案。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let viewSize = collectionView.bounds.size
    var cellWidth = viewSize.width / 2

    if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {
        let usableViewWidth = viewSize.width - flowLayout.sectionInset.left - flowLayout.sectionInset.right
        cellWidth = usableViewWidth / 2 - flowLayout.minimumInteritemSpacing / 2
    }
    return CGSize(width: cellWidth, height: cellWidth)
}