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