美文网首页
自定义格子视图LFGridView

自定义格子视图LFGridView

作者: 菲特峰 | 来源:发表于2020-09-18 17:18 被阅读0次

效果如图


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

相关文章

  • 自定义格子视图LFGridView

    效果如图 使用方法 遵循代理方法

  • iOS-自定义视图

    自定义视图 自定义视图:系统标准UI之外,自己组合而出的新的视图。自定义视图的优点:iOS提供了很多UI组件,借助...

  • 高级UI<第十一篇>:视图的摆放(onLayout)

    视图摆放,即自定义视图onLayout的实现,当自定义一个视图时,基本都会重写onMeasure、onLayout...

  • SYAlertView弹窗视图

    SYAlertView自定义弹窗子视图UI根据UI设计需求,自定义各种样式的弹窗子视图: 自定义UI及样式 自定义...

  • iOS-视图控制器

    视图控制器指定自定义View 自定义视图类继承UIView。在初始化方法中添加子视图控件。重写controller...

  • Swift gif动态启动页面

    创建一个自定义的视图LaunchImageView(UIImageView),在自定义视图中,加载gif图 随后在...

  • Android自定义视图控件

    本文介绍了使用Android绘图API开发自定义视图控件,主要包括: 1.自定义视图属性 2.自定义控...

  • iOS7、8半透明弹出框及弹出后弹出前页面消失问题

    需求:做一个自定义视图弹框,弹出框之外的背景视图为半透明设计方案:使用模态视图弹出自定义视图产生问题:presen...

  • iOS_UI_03_视图控制器

    视图控制器 一、自定义视图(label-textField组合视图) 二、视图控制器 三、视图控制器指定视图 四、...

  • iOS-自定义控件相关

    本篇涵盖自定义控件、视图等. 1.iOS开发-轻松学会封装自定义视图view(自定义弹框封装详解)2.iOS开发-...

网友评论

      本文标题:自定义格子视图LFGridView

      本文链接:https://www.haomeiwen.com/subject/wyfryktx.html