简体   繁体   中英

Unable to scroll in uipicker view in iOS?

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.

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 在此输入图像描述

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

你有没有尝试过

view.bringSubview(toFront: yourView)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM