Geen omschrijving

FFWaterfallViewLayout.swift 2.8KB

    // // 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 } }