Monday, July 9, 2018

Unable to scroll in uipicker view in iOS?

Leave a Comment

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

Item Picker View XIB enter image description here

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

enter image description here

Drive Link https://drive.google.com/open?id=14ThRCsXXGMr6ckqaC8mxTiyDj4HrGkXu

Answers 2

Have you tried

view.bringSubview(toFront: yourView) 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment