自定义格子视图LFGridView

160 阅读1分钟

效果如图 image.png

使用方法

  //设置快速入口
    func setupGridView() {
        let gridView =  LFGridView.init(frame: CGRect.init(x: 0, y: 150, width: kScreenWidth, height: 100))
        gridView.delegate = self
        gridView.deviderType = .deviderNone
        gridView.reLoadData()
        
        headView.addSubview(gridView)
    }

遵循代理方法

extension HomeViewController {
    
    func heightForRowInGridView(gridView: LFGridView) -> CGFloat {
        return 100
    }
    
    func numberOfColumsInGridView(gridView: LFGridView) -> Int {
        return 3
    }
    
    func totolNumberOfGridView(gridView: LFGridView) -> Int {
        return 3
    }
    
    func gridViewAtIndex(index: Int, gridView: LFGridView) -> LFGridButton {
    
        let button = LFGridButton()
        let imageV = UIImageView()
        imageV.image = UIImage.init(named: gridImages[index])
        button.addSubview(imageV)
        imageV.snp_makeConstraints { (make) in
            make.centerX.equalToSuperview()
            make.top.equalToSuperview().offset(20)
            make.width.equalTo(33)
            make.height.equalTo(30)
        }
        
        let label = UILabel()
        label.text = gridTitles[index]
        label.font = FONT(font: 14)
        button.addSubview(label)
        label.snp_makeConstraints { (make) in
            make.centerX.equalToSuperview()
            make.top.equalTo(imageV.snp_bottom).offset(10)
        }
        
        return button
    }
    
    func gridViewDidClick(index: Int, gridView: LFGridView) {
        
    }
}

//
//  LFGridView.swift
//  PXSSwift
//
//  Created by Pro on 2020/5/6.
//  Copyright © 2020 刘刘峰. All rights reserved.
//

import UIKit

@objc protocol LFGridViewDelegate {
    //每行的高度
    @objc func heightForRowInGridView(gridView:LFGridView) ->CGFloat
    //gridView列的数量
    @objc func numberOfColumsInGridView(gridView:LFGridView) ->Int
    //gridView中item总量
    @objc func totolNumberOfGridView(gridView:LFGridView) ->Int
    
    //返回每个item
    @objc func gridViewAtIndex(index:Int,gridView:LFGridView) ->LFGridButton
    
    //item点击事件
    
    @objc func gridViewDidClick(index:Int,gridView:LFGridView)


}
//TODO 加入分割线
enum LFGridViewDeviderType {
    case deviderDefault
    case deviderNone
}

class LFGridView: UIView {
    weak var delegate :LFGridViewDelegate?
    var deviderType: LFGridViewDeviderType? {
        didSet {
            if self.deviderType == LFGridViewDeviderType.deviderDefault {
                self.isShowDevider = true
            }else {
                self.isShowDevider = false
            }
            
            if self.isShowDevider == false {
                for view in self.dividers{
                    if view.superview != nil {
                        view.removeFromSuperview()
                    }
                }
            }
        }
    }
    
    var dividers = [UIView]()
    var isShowDevider:Bool = true
    
    var dataSource = [Any]()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.deviderType = .deviderDefault
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func reLoadData() {
        
        self.dividers.removeAll()
        for view in self.subviews {
            if view.superview != nil {
                view.removeFromSuperview()
            }
        }
        
        var row = 0
        var column = 0
        var sum = 0
        var size = CGSize.zero
        
        if self.delegate != nil {
            column = self.delegate!.numberOfColumsInGridView(gridView: self)
            sum = self.delegate!.totolNumberOfGridView(gridView: self)
            size.height = self.delegate!.heightForRowInGridView(gridView: self)
        }
        
        if column>0 {
            row = sum / column + (sum % column > 0 ? 1:0)
            size.width = self.width / CGFloat(column)

        }
        
        var orginX:CGFloat = 0
        var orginY:CGFloat = 0
        
        for i in 0..<row {
            for j in 0..<column {
                if delegate != nil {
                    orginX = j.cgFloat * size.width
                    orginY = i.cgFloat * size.height
                    let index = i * column + j
                    //
                   let view =  delegate!.gridViewAtIndex(index: index, gridView: self)
                    view.frame = CGRect.init(x: orginX, y: orginY, width: size.width, height: size.height)
                    view.tag = index + 999
                    
                    view.addTarget(self, action: #selector(onButtonClick(button:)), for: UIControl.Event.touchUpInside)
                    
                    self.addSubview(view)
                    
                    if self.isShowDevider == true {
                        
                        let dividLine = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 0.5, height: size.height))
        
                        dividLine.backgroundColor = AppColor.lineColor
                        dividLine.lf_left = view.lf_right-0.5
                        self.addSubview(dividLine)
                        dividers.append(dividLine)
                    }
                }
            }
        }
        
        //设置frame
        self.frame = CGRect.init(x: self.frame.origin.x, y: self.frame.origin.y, width: self.width, height: row.cgFloat * size.height)
        
        
        
        
    }
    
    
    @objc func onButtonClick(button:UIButton) {
        if delegate != nil {
            delegate!.gridViewDidClick(index: button.tag - 999, gridView: self)
        }
    }
    
    func getGridViewHeight()-> CGFloat {
        return self.height
    }
    
    
}