为什么我的自定义UICollectionViewLayout在单元格之间添加空格时会抛出错误?

时间:2016-10-18 21:24:35

标签: swift uicollectionviewlayout

我正在为练习制作一个自定义UICollectionViewLayout课程,主要是尝试重现水平流动布局,其中单元格无限地水平布局。

一切都与我的prepare()layoutAttributesForElements()函数完美配合,如下所示:

override func prepare() {
    cache.removeAll(keepingCapacity: false)

    var frame = CGRect.zero

    for item in 0..<numberOfItems {
        let indexPath = IndexPath(item: item, section: 0)
        let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
        frame = CGRect(x: CGFloat(item) * width + CGFloat(item) * spacing, y: 0, width: width, height: height)
        attributes.frame = frame
        cache.append(attributes)
    }
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    var layoutAttributes = [UICollectionViewLayoutAttributes]()
    for attributes in cache {
        if attributes.frame.intersects(rect) {
            layoutAttributes.append(attributes)
        }
    }
    return layoutAttributes
}

当我尝试向spacing中的后续行中的x坐标添加值prepare()的插入时出现问题,以便集合视图中的第一个单元格具有向左插入:

frame = CGRect(x: CGFloat(item) * width + CGFloat(item) * spacing, y: 0, width: width, height: height)

一旦我这样做,一切都看起来很好,直到我尝试在集合视图中滑动。抛出以下异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no UICollectionViewLayoutAttributes instance for -layoutAttributesForItemAtIndexPath: <NSIndexPath: 0x618000036060> {length = 2, path = 0 - 3}'

有人请解释为什么会这样吗?有没有其他方法来实现布局?

1 个答案:

答案 0 :(得分:0)

找到解决方案!显然覆盖layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?解决了这个问题!但我不明白为什么。