Я делаю собственный класс 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}'
Кто-нибудь объяснит, почему это происходит? Есть ли альтернативный способ достижения макета?