UIPicker detect tap on currently selected row

后端 未结 8 1412
礼貌的吻别
礼貌的吻别 2020-12-01 10:11

I have a UIPickerView and The method didSelectRow is not called when tapping on a selected row. I need to handle

8条回答
  •  鱼传尺愫
    2020-12-01 10:45

    Nikolay's answer in Swift 4:

    First, add a UITapGestureRecognizer to your UIPickerView in viewDidLoad() and let your UIViewController conform to the UIGestureRecognizerDelegate.

    let tap = UITapGestureRecognizer(target: self, action: #selector(pickerTapped))
    tap.delegate = self
    self.pickerView.addGestureRecognizer(tap)
    

    Add this function which calls your UIPickerViewDelegate when a tap on a row has been detected:

    @objc func pickerTapped(tapRecognizer: UITapGestureRecognizer) {
        if tapRecognizer.state == .ended {
            let rowHeight = self.pickerView.rowSize(forComponent: 0).height
            let selectedRowFrame = self.pickerView.bounds.insetBy(dx: 0, dy: (self.pickerView.frame.height - rowHeight) / 2)
            let userTappedOnSelectedRow = selectedRowFrame.contains(tapRecognizer.location(in: self.pickerView))
            if userTappedOnSelectedRow {
                let selectedRow = self.pickerView.selectedRow(inComponent: 0)
                pickerView(self.pickerView, didSelectRow: selectedRow, inComponent: 0)
            }
        }
    }
    

    Add the shouldRecognizeSimultaneouslyWith method from UIGestureRecognizerDelegate:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
    

提交回复
热议问题