|
//
// FFWaterfallViewLayout.swift
// PaiAi
//
// Created by FFIB on 2017/11/13.
// Copyright © 2017年 yb. All rights reserved.
//
import UIKit
class FFWaterfallViewLayout: UICollectionViewLayout {
private var maxYDict = [Int: CGFloat]()
private var attributeArr = [UICollectionViewLayoutAttributes]()
private var itemWidth: CGFloat = -1
var configuration = FFWaterfallConfiguration(columnCount: 2, columnSpace: 6, rowSpace: 6)
override init() {
super.init()
}
convenience init(configuration: FFWaterfallConfiguration) {
self.init()
self.configuration = configuration
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func prepare() {
super.prepare()
attributeArr.removeAll()
for i in 0..<configuration.columnCount {
maxYDict[i] = 0
}
guard let itemCount = collectionView?.numberOfItems(inSection: 0) else {
return
}
for i in 0..<itemCount {
if let attributes = layoutAttributesForItem(at: IndexPath(row: i, section: 0)) {
attributeArr.append(attributes)
}
}
}
override var collectionViewContentSize: CGSize {
guard let collectionView = collectionView else { return CGSize.zero }
let maxY = maxYDict.reduce(0) { (res, arg1) -> CGFloat in
return max(res, arg1.value)
}
return CGSize(width: collectionView.bounds.width, height: maxY)
}
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
if itemWidth == -1 {
let collectionViewWidth = collectionView?.frame.width ?? 0
itemWidth = (collectionViewWidth - configuration.columnSpace * (CGFloat(configuration.columnCount + 1))) / CGFloat(configuration.columnCount)
}
let itemSize = ((collectionView?.delegate as? UICollectionViewDelegateFlowLayout)?.collectionView!(collectionView!, layout: self, sizeForItemAt: indexPath))!
let itemHeight = itemSize.width / itemWidth * itemSize.height
var itemY = maxYDict[0]!
var column = 0
for (key, value) in maxYDict
where itemY > value {
itemY = value
column = key
}
let itemX = CGFloat(column) * itemWidth + CGFloat(column + 1) * configuration.columnSpace
attributes.frame = CGRect(x: itemX, y: itemY + configuration.rowSpace, width: itemWidth, height: itemHeight)
maxYDict[column] = attributes.frame.maxY
return attributes
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
return attributeArr
}
}
|