Thank you Claude31 for your attention.
Here is full code of BNPickerView.
swift
//
// BNPickerView.swift
//
//
import UIKit
class BNPickerView: UIView {
enum doneMode: Int {
case done = 0
case save = 1
}
var doneStyle: doneMode = .done
let picker: UIPickerView = UIPickerView(forAutoLayout: ())
let toolbar = UIToolbar(forAutoLayout: ())
let doneButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(donePushed(_:)))
let saveButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(donePushed(_:)))
let cancelButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelPushed(_:)))
let backgroundView: UIView = UIView(forAutoLayout: ())
let toggle: BNToggleView = BNToggleView(frame: CGRect(x: 0, y: 0, width: 151, height: 32))
var data:[[String]] = [[]]
var doneResultHandler:([String],[Int])-() = {_,_ in }
func setData(data:[[String]], doneResultHandler:@escaping ([String],[Int])-()){
self.parentViewController()?.view.endEditing(true)
self.data = data
self.doneResultHandler = doneResultHandler
backgroundView.isUserInteractionEnabled = true
backgroundView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissView(sender:))))
self.picker.dataSource = self
self.picker.delegate = self
self.addSubview(backgroundView)
backgroundView.autoPinEdge(toSuperviewEdge: .top)
backgroundView.autoPinEdge(toSuperviewEdge: .left)
backgroundView.autoPinEdge(toSuperviewEdge: .right)
backgroundView.backgroundColor = UIColor.black.withAlphaComponent(0.7)
self.addSubview(toolbar)
toolbar.autoPinEdge(toSuperviewEdge: .left)
toolbar.autoPinEdge(toSuperviewEdge: .right)
let done = self.doneStyle == .done ? doneButton : saveButton
toolbar.setItems([cancelButton, UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), done], animated: true)
toolbar.addSubview(toggle)
toggle.configureForAutoLayout()
toggle.autoAlignAxis(toSuperviewAxis: .horizontal)
toggle.autoAlignAxis(toSuperviewAxis: .vertical)
toggle.autoSetDimensions(to: CGSize(width: 151, height: 32))
toggle.alpha = 0
self.addSubview(picker)
picker.autoPinEdge(toSuperviewSafeArea: .left)
picker.autoPinEdge(toSuperviewSafeArea: .right)
picker.autoPinEdge(toSuperviewEdge: .bottom)
picker.autoSetDimension(.height, toSize: 315)
picker.backgroundColor = UIColor.white
toolbar.autoPinEdge(.bottom, to: .top, of: picker)
backgroundView.autoPinEdge(.bottom, to: .top, of: toolbar)
}
override func draw(_ rect: CGRect) {
self.alpha = 0.0
UIView.animate(withDuration: 0.2,
animations: {
self.alpha = 1.0
},
completion: {_ in
})
}
@objc func donePushed(_ sender: UIBarButtonItem) {
var out:[String] = []
var outIndex:[Int] = []
for index in 0..data.count{
outIndex.append(picker.selectedRow(inComponent: index))
out.append(data[index][picker.selectedRow(inComponent: index)])
}
self.doneResultHandler(out,outIndex)
dismiss()
return
}
@objc func cancelPushed(_ sender: UIBarButtonItem) {
dismiss()
}
@objc func dismissView(sender:UIView){
dismiss()
}
func dismiss(){
UIView.animate(withDuration: 0.2,
animations: {
self.alpha = 0.0
},
completion: {_ in
self.removeFromSuperview()
})
}
}
extension BNPickerView: UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) - Int {
return data.count
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) - Int {
return data[component].count
}
}
extension BNPickerView: UIPickerViewDelegate{
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) - String? {
return data[component][row]
}
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) - CGFloat {
return 40
}
}