Я вложил в подкласс UICollectionViewFlowLayout
перекрытие ячеек, используя код из ответов на этот вопрос . Я вижу проблему, когда размер содержимого представления коллекции неправильный - он прокручивается слишком далеко за последней ячейкой. Причина в том, что вычисленное collectionViewContentSize
не вычитает смещение перекрытия. Однако, если я сделаю это, прокручиваемая область кажется правильной, но при прокрутке новые ячейки не появляются, даже если вызывается cellForItemAt
- он только создает ячейки, которые изначально были на экране. Почему это так, как тут исправить?
class CollectionViewOverlappingFlowLayout: UICollectionViewFlowLayout {
var overlap: CGFloat = 10
override var collectionViewContentSize: CGSize {
let xSize = CGFloat(collectionView!.numberOfItems(inSection: 0)) * itemSize.width //FIXME: Results in too much space after last cell
//let xSize = (numberOfItems * itemSize.width) - ((numberOfItems - 1) * overlap) //FIXME: Results in new cells not being created as you scroll
let ySize = CGFloat(collectionView!.numberOfSections) * itemSize.height
return CGSize(width: xSize, height: ySize)
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
let numberOfItems = collectionView!.numberOfItems(inSection: 0)
for attributes in attributes ?? [] {
var xPosition = attributes.center.x
let yPosition = attributes.center.y
if attributes.indexPath.row == 0 {
attributes.zIndex = Int(INT_MAX) // Put the first cell on top of the stack
} else {
xPosition -= overlap * CGFloat(attributes.indexPath.row)
attributes.zIndex = numberOfItems - attributes.indexPath.row //Other cells below the first one
}
attributes.center = CGPoint(x: xPosition, y: yPosition)
}
return attributes
}
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
return UICollectionViewLayoutAttributes(forCellWith: indexPath)
}
}