I have created a XIB file for picker view & now on tap gesture i am adding the picker view on superview. It is added successfuly but I am not able to scroll.I have also added two button for cancel & done but none of the action for those buttons are detected. Kindly let me know what is the issue
Here is code for adding uipicker view.
@objc func didRecognizeTapGesture(_ gesture: UITapGestureRecognizer) { let frame:CGRect = CGRect(x: 0, y: self.view.frame.height + 200, width: self.view.frame.width, height: 200) self.itemPicker = ItemPicker.instanceFromNib(with: frame) as? ItemPicker self.itemPicker?.configureView(frame: frame) self.view.addSubview(self.itemPicker!) self.itemPicker?.itemPickerDelegate = self showView() } func showView() { UIView.animate(withDuration: 0.2) { self.itemPicker?.frame = CGRect(x: 0, y: self.view.frame.height - 200, width: self.view.frame.width, height: 200) } } func hideView() { UIView.animate(withDuration: 0.2) { self.itemPicker?.frame = CGRect(x: 0, y: self.view.frame.height, width: self.view.frame.width, height: 200) } }
Code for class picker view
protocol ItemPickerDelegate { func pickerCancelled() func pickerDone() func itemPicked(with item:String) } class ItemPicker: UIPickerView { /// IBOutlets @IBOutlet weak var pickerView: UIPickerView! var itemPickerDelegate:ItemPickerDelegate! var arrItems:[String] = ["Item1","Item2","Item3","Item5","Item6"] class func instanceFromNib(with frame:CGRect) -> UIView { let view = Bundle.main.loadNibNamed(Titles.XIB.itemPicker, owner: self, options: nil)! [0] as! UIView return view } func configureView(frame:CGRect) { self.frame = frame self.pickerView.delegate = self self.pickerView.dataSource = self } //MARK:IBActions @IBAction func actionCancel(_ sender: Any) { DILog.print(items: "actionCancel") self.itemPickerDelegate.pickerCancelled() } @IBAction func actionDone(_ sender: Any) { DILog.print(items: "actionDone") self.itemPickerDelegate.pickerDone() } } extension ItemPicker:UIPickerViewDelegate { func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return arrItems[row] } } extension ItemPicker:UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return arrItems.count } }
Kindly help me out with this problem.
2 Answers
Answers 1
View Controller Class
import UIKit class StackViewClass: UIViewController { /// View in which Picker Subview will be added var baseView : UIView? /// Picker View Class object var customPickerView : ItemPicker? /// Gesture which is used to show the picker in subview var tapGesture : UITapGestureRecognizer? override func viewDidLoad() { super.viewDidLoad() /// Assigning Tap gesture tapGesture = UITapGestureRecognizer() tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(handleViewTapGesture(_:))) } override func viewDidAppear(_ animated: Bool) { /// Adding Base View in Main View baseView = UIView() baseView?.backgroundColor = UIColor.lightGray baseView?.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(baseView!) baseView?.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true baseView?.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true baseView?.widthAnchor.constraint(equalToConstant: 250).isActive = true baseView?.heightAnchor.constraint(equalToConstant: 150).isActive = true /// Adding Gesture baseView?.addGestureRecognizer(tapGesture!) } /// Tap Gesture Handler @objc func handleViewTapGesture(_ sender: UITapGestureRecognizer) { customPickerView = ItemPicker() customPickerView?.frame = CGRect(x: 0, y: sender.view!.frame.maxY, width: sender.view!.frame.size.width, height: sender.view!.frame.size.height) sender.view?.addSubview(customPickerView!) self.showView(sender.view!) } /// Function which is used to show Picker in base View func showView(_ sender: UIView) { customPickerView?.removeFromSuperview() sender.addSubview(customPickerView!) UIView.animate(withDuration: 0.2) { self.customPickerView?.frame = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height) } } }
Your Item Picker Class
import UIKit protocol ItemPickerDelegate { func pickerCancelled() func pickerDone() func itemPicked(with item:String) } /// Assign Class to UIView class ItemPicker: UIView { /// After assigning FileOwner to ItemPicker Class /// Create ContentView Outlet @IBOutlet var contentView: UIView! /// IBOutlets @IBOutlet weak var pickerView: UIPickerView! /// Arrays var itemPickerDelegate:ItemPickerDelegate! var arrItems:[String] = ["Item1","Item2","Item3","Item5","Item6"] /// Frame override init(frame: CGRect) { super.init(frame: frame) loadNib() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) loadNib() } /// I am Here loading Nib names as "ItemPicker" func loadNib() { Bundle.main.loadNibNamed("ItemPicker", owner: self, options: [:]) // 2. Adding the 'contentView' to self (self represents the instance of a WeatherView which is a 'UIView'). addSubview(contentView) // 3. Setting this false allows us to set our constraints on the contentView programtically contentView.translatesAutoresizingMaskIntoConstraints = false contentView.backgroundColor = UIColor.clear // 4. Setting the constraints programatically contentView.topAnchor.constraint(equalTo: topAnchor).isActive = true contentView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true contentView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true contentView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true pickerView.delegate = self pickerView.dataSource = self } func configureView(frame:CGRect) { self.frame = frame self.pickerView.delegate = self self.pickerView.dataSource = self } //MARK:IBActions @IBAction func actionCancel(_ sender: Any) { // DILog.print(items: "actionCancel") self.itemPickerDelegate.pickerCancelled() } @IBAction func actionDone(_ sender: Any) { // DILog.print(items: "actionDone") self.itemPickerDelegate.pickerDone() } } extension ItemPicker:UIPickerViewDelegate { func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return arrItems[row] } } extension ItemPicker:UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return arrItems.count } }
Simulator Output
Drive Link https://drive.google.com/open?id=14ThRCsXXGMr6ckqaC8mxTiyDj4HrGkXu
Answers 2
Have you tried
view.bringSubview(toFront: yourView)
0 comments:
Post a Comment