Swift 自定義UICollectionViewLayout,使CollectionView的item橫向排列

使用

let layout = MCHorizontalPageLayout()
layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
layout.minimumInteritemSpacing = 1
layout.minimumLineSpacing = 1
layout.itemSize = CGSize(width: SCREEN_WIDTH, height: frame.size.height)

聲明

//
//  MCHorizontalPageLayout.swift
//  BJYYGHT
//
//  Created by satoshi_umaM1 on 2021/7/13.
//

import UIKit

class MCHorizontalPageLayout: UICollectionViewLayout {
    var minimumLineSpacing: CGFloat = 0.0
    var minimumInteritemSpacing: CGFloat = 0.0
    var itemSize: CGSize = CGSize(width: 0, height: 0)
    var sectionInset: UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    /// 數組
    private var layoutAttributes: Array<UICollectionViewLayoutAttributes> = []
    /// 單頁行數
    private var _rowCount: NSInteger = 0
    private var rowCount: NSInteger {
        if _rowCount == 0 {
            let numerator: NSInteger = NSInteger(collectionView!.bounds.size.height - sectionInset.top - sectionInset.bottom + minimumLineSpacing)
            let denominator: NSInteger = NSInteger(minimumLineSpacing + itemSize.height)
            let count: NSInteger = numerator / denominator
            _rowCount = count
            // minimumLineSpacing itemSize.height不是剛好填滿 將多出來的補給minimumLineSpacing
            if (numerator % denominator) != 0 {
                minimumLineSpacing = (collectionView!.bounds.size.height - sectionInset.top - sectionInset.bottom - (CGFloat(count) * itemSize.height)) / CGFloat(count - 1)
            }
        }
        return _rowCount
    }

    /// 單頁列數
    private var _columnCount: NSInteger = 0
    private var columnCount: NSInteger {
        if _columnCount == 0 {
            let numerator: NSInteger = NSInteger(collectionView!.bounds.size.width - sectionInset.left - sectionInset.right + minimumInteritemSpacing)
            let denominator: NSInteger = NSInteger(minimumInteritemSpacing + itemSize.width)
            let count: NSInteger = numerator / denominator
            _columnCount = count
            // minimumInteritemSpacing itemSize.width不是剛好填滿 將多出來的補給minimumInteritemSpacing
            if (numerator % denominator) != 0 {
                minimumInteritemSpacing = (collectionView!.bounds.size.width - sectionInset.left - sectionInset.right - (CGFloat(count) * itemSize.width)) / CGFloat(count - 1)
            }
        }
        return _columnCount
    }

    override func prepare() {
        guard let itemCount = collectionView?.numberOfItems(inSection: 0) else { return }

        for i in 0 ..< itemCount {
            let indexPath = IndexPath(item: i, section: 0)
            let attributes = layoutAttributesForItem(at: indexPath)
            layoutAttributes.append(attributes!)
        }
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attri = UICollectionViewLayoutAttributes(forCellWith: indexPath)
        let item: NSInteger = indexPath.item
        // 總頁數
        let pageNumber: NSInteger = item / ((rowCount * columnCount) == 0 ? 1 : (rowCount * columnCount))
        // 該頁中item的序號
        let itemInPage: NSInteger = item % ((rowCount * columnCount) == 0 ? 1 : (rowCount * columnCount))
        // item的所在列、行
        let col: NSInteger = itemInPage % (columnCount == 0 ? 1 : columnCount)
        let row: NSInteger = itemInPage / (columnCount == 0 ? 1 : columnCount)

        let x: CGFloat = sectionInset.left + (itemSize.width + minimumInteritemSpacing) * CGFloat(col) + CGFloat(pageNumber) * collectionView!.bounds.size.width
        let y: CGFloat = sectionInset.top + (itemSize.height + minimumLineSpacing) * CGFloat(row)

        attri.frame = CGRect(x: x, y: y, width: itemSize.width, height: itemSize.height)

        return attri
    }

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

    override var collectionViewContentSize: CGSize {
        let itemCount: NSInteger = collectionView!.numberOfItems(inSection: 0)
        var pageNumber: NSInteger = itemCount / ((rowCount * columnCount) == 0 ? 1 : (rowCount * columnCount))
        if (itemCount % ((rowCount * columnCount) == 0 ? 1 : (rowCount * columnCount))) != 0 {
            pageNumber += 1
        }
        return CGSize(width: CGFloat(pageNumber) * collectionView!.bounds.size.width, height: collectionView!.bounds.size.height)
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章