Swift 自定义UICollectionViewLayout的实现

911 阅读1分钟

// // TestRandomUICollectionViewLayout.swift // WCJ_SWIFT_STUDY // // Created by 王成杰 on 2020/3/6. // Copyright © 2020 wangcj. All rights reserved. //

import UIKit

class TestRandomUICollectionViewLayout: UICollectionViewLayout {

let SCREEN_W = UIScreen.main.bounds.size.width
let SCREEN_H = UIScreen.main.bounds.size.height
var contentH: CGFloat = 0
let numberColumns = 2
let lineSpace: CGFloat = 10
var attributeStore = [UICollectionViewLayoutAttributes ]()

override func prepare() {
    
    super.prepare()
    
    if attributeStore.isEmpty {
        
        let columW  = (SCREEN_W - 3.0 * lineSpace)/CGFloat(numberColumns)
        
        var xOffset = [CGFloat]()
        
        for colum in 0 ..< numberColumns {
            
            xOffset.append(CGFloat(colum) * columW + lineSpace * CGFloat(colum) + lineSpace )
        }
        
        var colum: Int = 0
        
        var yOffset = [CGFloat](repeating: 0, count: numberColumns)
        
        for item in 0 ..<  collectionView!.numberOfItems(inSection: 0) {
            
            let indexPath = NSIndexPath(item: item, section: 0)
            
            let randomNumber: Int =  Int(arc4random() % 100) + 70
            let height = CGFloat(randomNumber)
            
            let frame = CGRect(x: xOffset[colum], y: yOffset[colum], width: columW, height: height)
            
            let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath as IndexPath)
            attributes.frame = frame
            attributeStore.append(attributes)
            
            contentH = max(contentH, frame.maxY)
            yOffset[colum] = yOffset[colum] + height + lineSpace
            colum = colum >= (numberColumns - 1) ? 0: 1
        }
        
    }
    
}

override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    
    return attributeStore[indexPath.row]
}

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


override var collectionViewContentSize: CGSize{
    
    return CGSize(width: SCREEN_W, height: contentH)
}

}