封装思路
UIPickerView是大家常用的控件,所以简单封装了一下,支持多行,用法也超级简单,一句话集成,HanPickerView.shared?.show(dataArray:[storeTypeTitleArray])
HanPickerView.shared?.hanSureBtnBlock = {(arr) in }
注:是数组到数组,这样可以达到分区的效果。
全部代码如下:
import UIKit
class HanPickerView: UIView {
//typedef
typealias HanSureBtnBlock=(_ dataArr:[String])->Void
//声明闭包
var hanSureBtnBlock:HanSureBtnBlock?
var array:[Any] = []
var titleArray:[String] = []
static var shared:HanPickerView? = HanPickerView(){
didSet{
if shared == nil{
shared = HanPickerView()
}
}
}
func show(dataArray:Array<Any>) {
self.array = dataArray
self.titleArray.removeAll()
for _ in 0...(self.array.count){
self.titleArray.append("")
}
if dataArray.count > 0 {
let arr:[Any] = dataArray[0] as! Array
let t:String = arr[0] as! String
self.titleArray[0] = t;
}
let rootRect = UIApplication.shared.windows.first?.frame //应用屏幕大小
let container = UIView() //全屏且透明,盖在最上面, 可以自定义点击事件, 从而实现模态和非模态框效果。
container.backgroundColor = UIColor(hue: 0, saturation: 0, brightness: 0, alpha: 0.3)
container.frame = rootRect!
let whiteView = UIView.init(frame: CGRect.init(x: 0, y: SCREEN_HEIGHT * 0.65, width: SCREEN_WIDTH , height: SCREEN_HEIGHT * 0.35))
whiteView.backgroundColor = UIColor.white
let topView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: SCREEN_WIDTH, height: whiteView.frame.size.height * 0.2))
topView.backgroundColor = BG_COLOR
whiteView.addSubview(topView)
let cancelBtn = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: topView.width * 0.3, height: topView.height))
cancelBtn.setTitleColor(.black, for: .normal)
cancelBtn.setTitle(LanguageHelper.getString(key: "public_cancel"), for: .normal)
cancelBtn.addTarget(self, action: #selector(cancelBtnClicked), for: .touchUpInside)
topView.addSubview(cancelBtn)
let sureBtn = UIButton.init(frame: CGRect.init(x: topView.width * 0.7, y: 0, width: topView.width * 0.3, height: topView.height))
sureBtn.setTitleColor(.black, for: .normal)
sureBtn.setTitle(LanguageHelper.getString(key: "PickerView_confirmTitle_button"), for: .normal)
sureBtn.addTarget(self, action: #selector(sureBtnClicked), for: .touchUpInside)
topView.addSubview(sureBtn)
let pickView = UIPickerView.init(frame: CGRect.init(x: 0, y: whiteView.frame.size.height * 0.2, width: SCREEN_WIDTH, height: whiteView.frame.size.height * 0.8))
pickView.delegate = self
pickView.dataSource = self
whiteView.addSubview(pickView)
container.addSubview(whiteView)
UIApplication.shared.keyWindow?.addSubview(container)
}
@objc func cancelBtnClicked() {
UIApplication.shared.keyWindow?.subviews.last?.removeFromSuperview()
HanPickerView.shared = nil
}
@objc func sureBtnClicked() {
hanSureBtnBlock!(self.titleArray)
UIApplication.shared.keyWindow?.subviews.last?.removeFromSuperview()
HanPickerView.shared = nil
}
func hide() {
UIApplication.shared.keyWindow?.subviews.last?.removeFromSuperview()
HanPickerView.shared = nil
}
}
extension HanPickerView:UIPickerViewDelegate,UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return self.array.count
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
let arr:[Any] = self.array[component] as! Array
return arr.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
let arr:[Any] = self.array[component] as! Array
let t:String = arr[row] as! String
return t
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let arr:[Any] = self.array[component] as! Array
let t:String = arr[row] as! String
self.titleArray[component] = t
}
}