使用
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)
}
}