Swift UICollectionViewFlowLayout Z型布局

35 阅读1分钟

image.png

class ALZTypeFlowLayout: UICollectionViewFlowLayout {
    private var contentWidth: CGFloat = 0
    private var page: Int = 0
    private var attributesArray = [UICollectionViewLayoutAttributes]()

    override func prepare() {
        super.prepare()
        minimumInteritemSpacing = 6
        minimumInteritemSpacing = 8
        scrollDirection = .horizontal
        itemSize = CGSize(width: (SCREEN_WIDTH - 15 - 12) / 3.0, height: 60)
        sectionInset = UIEdgeInsets(top: 0, left: 7, bottom: 0, right: -8)
        guard let count = collectionView?.numberOfItems(inSection: 0) else { return }
        let leftMargin = sectionInset.left
        attributesArray.removeAll()
        for i in 0..<count {
            if let attributes = layoutAttributesForItem(at: IndexPath(item: i, section: 0)) {
                let index = attributes.indexPath.item
                let row = index % 3
                let colum = (index / 3) % 2
                let page = index / 6
                self.page = page
                attributes.frame.origin.x = leftMargin + CGFloat(row) * (itemSize.width + minimumInteritemSpacing) + CGFloat(page) * SCREEN_WIDTH
                attributes.frame.origin.y = CGFloat(colum) * (itemSize.height + minimumLineSpacing)
                attributes.frame.size = itemSize
                attributesArray.append(attributes)
            }
        }
        contentWidth = CGFloat(self.page + 1) * SCREEN_WIDTH
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        return attributesArray
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }

    override var collectionViewContentSize: CGSize {
        return CGSize(width: contentWidth, height: 128)
    }
}