达到
我想在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
// }
}
...
}
此致
亚伦
答案 0 :(得分:0)
问题解决了。
我认为问题在于调用collectionView(_:layout:sizeForItemAt:)
以确定collectionViewContentSize
属性。
但是我尝试访问其中的collectionViewContentSize
。
我使用bounds
的{{1}}对其进行了修复。
collectionView