Как создать макет потока для перехода по страницам, а не просто прокрутить представление коллекции - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть представление коллекции, которое имеет 3 элемента на странице. Когда у меня есть 4 элемента в представлении прокрутки и я прокручиваю коллекцию, я хочу перейти к следующей странице, содержащей только элемент 4, оставляя первые 3 элемента на первой странице.

Страница 1:

Page 1

Страница 2 (результат, которого я пытаюсь достичь):

enter image description here

Что я получаю, когда прокручиваю (неверный результат):

enter image description here

Я пытаюсь создать собственный макет потока для достижения результата на странице 2 (изображение 2). Но я все еще получаю неправильный результат (изображение 3).

Я пытался следовать этому уроку: https://github.com/maximbilan/UICollectionViewHorizontalPaging

Код, который у меня есть, таков:

Но я не смог получить результат изображения 2, используя его: /

Как создать собственный макет потока для перехода по страницам вместо простой прокрутки следующего элемента?

class CenterViewFlowLayout: UICollectionViewFlowLayout {

    override var collectionViewContentSize: CGSize {
        // Only support single section for now.
        // Only support Horizontal scroll
        let count = self.collectionView?.dataSource?.collectionView(self.collectionView!, numberOfItemsInSection: 0)
        let canvasSize = self.collectionView!.frame.size
        var contentSize = canvasSize
        if self.scrollDirection == UICollectionViewScrollDirection.horizontal {
            let rowCount = Int((canvasSize.height - self.itemSize.height) / (self.itemSize.height + self.minimumInteritemSpacing) + 1)
            let columnCount = Int((canvasSize.width - self.itemSize.width) / (self.itemSize.width + self.minimumLineSpacing) + 1)
            let page = ceilf(Float(count!) / Float(rowCount * columnCount))
            contentSize.width = CGFloat(page) * canvasSize.width
        }
        return contentSize
    }

    func frameForItemAtIndexPath(indexPath: NSIndexPath) -> CGRect {
        let canvasSize = self.collectionView!.frame.size
        let rowCount = Int((canvasSize.height - self.itemSize.height) / (self.itemSize.height + self.minimumInteritemSpacing) + 1)
        let columnCount = Int((canvasSize.width - self.itemSize.width) / (self.itemSize.width + self.minimumLineSpacing) + 1)

        let pageMarginX = (canvasSize.width - CGFloat(columnCount) * self.itemSize.width - (columnCount > 1 ? CGFloat(columnCount - 1) * self.minimumLineSpacing : 0)) / 2.0
        let pageMarginY = (canvasSize.height - CGFloat(rowCount) * self.itemSize.height - (rowCount > 1 ? CGFloat(rowCount - 1) * self.minimumInteritemSpacing : 0)) / 2.0

        let page = Int(CGFloat(indexPath.row) / CGFloat(rowCount * columnCount))
        let remainder = Int(CGFloat(indexPath.row) - CGFloat(page) * CGFloat(rowCount * columnCount))
        let row = Int(CGFloat(remainder) / CGFloat(columnCount))
        let column = Int(CGFloat(remainder) - CGFloat(row) * CGFloat(columnCount))

        var cellFrame = CGRect.zero
        cellFrame.origin.x = pageMarginX + CGFloat(column) * (self.itemSize.width + self.minimumLineSpacing)
        cellFrame.origin.y = pageMarginY + CGFloat(row) * (self.itemSize.height + self.minimumInteritemSpacing)
        cellFrame.size.width = self.itemSize.width
        cellFrame.size.height = self.itemSize.height

        if self.scrollDirection == UICollectionViewScrollDirection.horizontal {
            cellFrame.origin.x += CGFloat(page) * canvasSize.width
        }

        return cellFrame
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        guard let attr = super.layoutAttributesForItem(at:
            indexPath as IndexPath)?.copy() as? UICollectionViewLayoutAttributes? else { return nil }
        attr!.frame = self.frameForItemAtIndexPath(indexPath: indexPath as NSIndexPath)
        return attr
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let originAttrs = super.layoutAttributesForElements(in: rect)
        var attrs: [UICollectionViewLayoutAttributes]? = Array<UICollectionViewLayoutAttributes>()

        for attr in originAttrs! {
            let idxPath = attr.indexPath
            let itemFrame = self.frameForItemAtIndexPath(indexPath: idxPath as NSIndexPath)
            if itemFrame.intersects(rect) {
                let nAttr = self.layoutAttributesForItem(at: idxPath)
                attrs?.append(nAttr!)
            }
        }

        return attrs
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...