自定义下拉选择框
2020-09-17 本文已影响0人
菲特峰
效果图
image.png
使用方法
let menuV = LFPopMenuView.init(frame: CGRect.init(x: 15, y: 0, width: 80, height: 44), dataSource: ["aaa","bbb","ccc"])
menuV.rowHeight = 30
self.navigationController?.navigationBar.addSubview(menuV)
上代码
//
// LFPopMenuView.swift
// PXSSwift
//
// Created by Pro on 2020/5/28.
// Copyright © 2020 刘刘峰. All rights reserved.
//
import UIKit
class LFPopMenuView: UIView,UITableViewDelegate,UITableViewDataSource {
var block : LFIndexCallBack?
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return self.rowHeight
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.dataSource?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellId = "cell"
var cell = tableView.dequeueReusableCell(withIdentifier: cellId)
if cell == nil {
cell = UITableViewCell.init(style: UITableViewCell.CellStyle.default, reuseIdentifier: cellId)
}
cell?.textLabel?.text = self.dataSource?[indexPath.row]
cell?.textLabel?.font = textFontSize
return cell!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.title = self.dataSource?[indexPath.row]
self.dismiss()
if self.block != nil {
self.block!(indexPath.row)
}
}
//MARK:-属性
//标题
var title:String? {
didSet {
self.titleLab.text = self.title
}
}
//标题颜色
var titleColor:UIColor?
var titleFontSize:UIFont = UIFont.systemFont(ofSize: 12)
var textFontSize:UIFont = UIFont.systemFont(ofSize: 12)
var rowHeight:CGFloat = 44 {
didSet {
self.tableView.rowHeight = self.rowHeight
}
}
var dataSource:[String]?{
didSet {
self.tableViewHeight = (self.dataSource?.count.cgFloat)! * self.rowHeight
}
}
var tableViewHeight:CGFloat = 100
var isDirectionUp:Bool?
//MARK:-控件
lazy var titleLab:UILabel = {
let lab = UILabel()
lab.text = "请选择"
lab.font = self.titleFontSize
return lab
}()
lazy var rightImageView:UIImageView = {
let imageV = UIImageView()
imageV.image = UIImage.init(named: "list_icon_drfault")
return imageV
}()
lazy var maskBtn:UIButton = {
let btn = UIButton()
btn.backgroundColor = UIColor.clear
btn.clipsToBounds = true
btn.addTarget(self, action: #selector(show), for: UIControl.Event.touchUpInside)
return btn
}()
lazy var backgroundBtn:UIButton = {
let btn = UIButton()
btn.backgroundColor = UIColor.clear
btn.frame = UIScreen.main.bounds
btn.addTarget(self, action: #selector(dismiss), for: UIControl.Event.touchUpInside)
return btn
}()
lazy var tableView : UITableView = {
let tab = UITableView.init(frame: .zero, style: UITableView.Style.plain)
tab.tableFooterView = UIView()
tab.rowHeight = rowHeight
tab.delegate = self
tab.dataSource = self
tab.backgroundColor = UIColor.white
tab.layer.shadowOffset = CGSize.init(width: 4, height: 4)
tab.layer.shadowColor = UIColor.lightGray.cgColor
tab.layer.shadowOpacity = 0.8
tab.layer.shadowRadius = 4
tab.layer.borderColor = UIColor.gray.cgColor
tab.layer.borderWidth = 0.5
tab.layer.cornerRadius = self.cornerRadius
tab.separatorInset = UIEdgeInsets.init(top: 0, left: 5, bottom: 0, right: 5)
return tab
}()
convenience init(frame:CGRect,dataSource:[String]) {
self.init(frame: frame)
self.dataSource = dataSource
self.setupUI()
}
func setupUI(){
// self.cornerRadius = 5
// self.borderWidth = 1
// self.borderColor = AppColor.lineColor
self.addSubview(self.rightImageView)
self.addSubview(self.titleLab)
self.addSubview(self.maskBtn)
self.rightImageView.snp_makeConstraints { (make) in
make.centerY.equalTo(self);
make.right.equalTo(self.snp_right).offset(-10);
}
self.titleLab.snp_makeConstraints { (make) in
make.left.equalTo(self.snp_left).offset(10);
make.right.equalTo(self.rightImageView)
make.centerY.equalToSuperview()
make.height.equalTo(20)
}
self.maskBtn.snp_makeConstraints { (make) in
make.left.right.top.bottom.equalTo(self);
}
}
}
extension LFPopMenuView {
@objc func show () {
kkwindow?.addSubview(self.backgroundBtn)
kkwindow?.addSubview(self.tableView)
// 获取按钮在屏幕中的位置
let frame = self.convert(self.bounds, to: kkwindow)
let tableY = frame.origin.y + frame.size.height
var tableViewFrame:CGRect = .zero
tableViewFrame.size.width = frame.size.width
tableViewFrame.size.height = self.tableViewHeight
tableViewFrame.origin.x = frame.origin.x
if tableY + self.tableViewHeight < UIScreen.main.bounds.size.height {
tableViewFrame.origin.y = tableY
self.isDirectionUp = false
}else {
tableViewFrame.origin.y = frame.origin.y - tableViewHeight
self.isDirectionUp = true
}
self.tableView.frame = CGRect.init(x: tableViewFrame.origin.x, y: tableViewFrame.origin.y + ( self.isDirectionUp == true ? tableViewHeight:0), width: tableViewFrame.size.width, height: 0)
UIView.animate(withDuration: 0.25) {
self.rightImageView.transform = CGAffineTransform.init(rotationAngle: self.isDirectionUp == true ? (CGFloat(-Double.pi/2)):(CGFloat(Double.pi/2)))
// CGAffineTransformRotate(weakSelf.rightImageView.transform,self.isDirectionUp?-M_PI/2:M_PI/2);
self.tableView.frame = CGRect.init(x: tableViewFrame.origin.x, y: tableViewFrame.origin.y, width: tableViewFrame.size.width, height: tableViewFrame.size.height);
}
}
@objc func dismiss() {
UIView.animate(withDuration: 0.25, animations: {
self.rightImageView.transform = CGAffineTransform.identity
self.tableView.frame = CGRect.init(x: self.tableView.frame.origin.x, y: self.tableView.frame.origin.y + ( self.isDirectionUp == true ? self.tableViewHeight:0), width: self.tableView.frame.size.width, height: 0)
}) { (bol) in
self.backgroundBtn.removeFromSuperview()
self.tableView.removeFromSuperview()
}
}
}