ios:如何使UIPickerView(UIView)在UITouchRecognizer之前捕捉触摸事件?

ios:如何使UIPickerView(UIView)在UITouchRecognizer之前捕捉触摸事件?,ios,uiview,uigesturerecognizer,uipickerview,uitapgesturerecognizer,Ios,Uiview,Uigesturerecognizer,Uipickerview,Uitapgesturerecognizer,他说:“有时候,你可能希望视图在手势识别器之前接收到触碰”,但我找不到如何做到这一点 我尝试了delaystouchesend=false,但没有任何效果 @IBOutlet weak var myPickerView: UIPickerView! override func viewDidLoad() { super.viewDidLoad() let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(ta

他说:“有时候,你可能希望视图在手势识别器之前接收到触碰”,但我找不到如何做到这一点

我尝试了delaystouchesend=false,但没有任何效果

@IBOutlet weak var myPickerView: UIPickerView!

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyViewController.pickerViewTapped(_:)))
    tapGesture.delegate = self
    tapGesture.delaysTouchesEnded = false
    myPickerView.addGestureRecognizer(tapGesture)
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
    // called by UIPickerView 
    print("pickerView called!")
}

func pickerViewTapped(_ sender: UITapGestureRecognizer) {
    // called by UITapGestureRecognizer
    print("pickerViewTapped called!")
}
当我点击myPickerView时,控制台将是

pickerViewTapped called!
pickerView called!

但我要的是相反的顺序。怎么做?

简短回答:

您不能仅使用UIGestureRecognitor来执行此操作

长答案:

由于将行移动到UIPickerView本身的中心所需的动画,因此在选择UIPickerView的行的操作和调用方法
didSelectRow
之间始终存在延迟

还要注意的是,如果点击中间的行,则不会调用
didSelectRow
方法,而只调用
pickerviewttapped

这种延迟必然导致执行顺序:

  • pickerViewTapped
  • pickerView(pickerView:UIPickerView,
    didSelectRow行:Int,不完整组件:Int){
  • 我找到的解决方案是:

    func pickerViewTapped(_ sender: UITapGestureRecognizer) {
        // called by UITapGestureRecognizer
    
        let timeDelay = 0.6
        //0.6 is arbitrary value, depends on you
        DispatchQueue.main.asyncAfter(deadline: .now() + timeDelay) {
            print("pickerViewTapped called!")
        }
    }
    
    我知道也许这不是你想要的答案,我也不知道你为什么会有这样的行为,但这是我找到的最接近的解决办法