Почему мой пользовательский 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}'

Кто-нибудь объяснит, почему это происходит? Есть ли альтернативный способ достижения макета?


person cyril    schedule 18.10.2016    source источник


Ответы (1)


Решение найдено! По-видимому, переопределение layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? решает проблему! Но я понятия не имею, почему.

person cyril    schedule 18.10.2016