Исправьте collectionViewContentSize с помощью пользовательского UICollectionViewFlowLayout для перекрывающихся ячеек - PullRequest
0 голосов
/ 03 апреля 2020

Я вложил в подкласс 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)
    }

}
...