访问layout.collectionViewContentSize时collectionView(_:layout:sizeForItemAt :)中的异常

时间:2018-07-11 07:06:36

标签: ios swift exception uicollectionviewlayout uicollectionviewdelegateflowlayout

达到

我想在UICollectionView中使用两个不同的项目大小。因此,我已经实现了

collectionView(_:layout:sizeForItemAt:) of UICollectionViewDelegateFlowLayout

错误

但是我面临的问题是,每当我访问此功能中的collectionViewLayout.collectionViewContentSize时,我的应用都会崩溃,并出现异常。

以下是例外:

  

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* -[__ 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)
    }
}

在集合视图控制器子类中,我将TwoSizesCellFlowLayout对象分配给delegate的{​​{1}}属性:

UICollectionViewController

第一个引发调用堆栈:

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
//        }
    }

    ...

}

此致

亚伦

1 个答案:

答案 0 :(得分:0)

问题解决了。

我认为问题在于调用collectionView(_:layout:sizeForItemAt:)以确定collectionViewContentSize属性。 但是我尝试访问其中的collectionViewContentSize

我使用bounds的{​​{1}}对其进行了修复。

collectionView