iOS addGestureRecognizer with cancelsTouchesInView = false 不适用于子视图按钮

iOS addGestureRecognizer with cancelsTouchesInView = false does not work with subview buttons

我 ViewController 以这种方式实现了 UIGestureRecognizer:

// Extension for GestureRecognizer
extension UIViewController {
    func addGestureRecognizer() {
        let singleTap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        singleTap.cancelsTouchesInView = false
        singleTap.numberOfTapsRequired = 1
        self.view.addGestureRecognizer(singleTap)
    }

    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
        self.view.endEditing(false)
    }
}

如您所见,默认情况下 cancelsTouchesInView 设置为 false。它适用于带 searchBar 和 textFields 的主视图。键盘被关闭,触摸被转换为视图的对象 - 按钮等。

但是我添加了子视图,其工作方式类似于具有多个 UITextField 和 UIButton 的 AlertView。这是一个问题。当显示子视图并且我点击此子视图的任何按钮时 - gestureRecognizer 做出反应并且键盘消失。但没有其他事情发生。所以我必须第二次点击按钮才能按下它。

我尝试将 UITapGestureRecognizer 的目标从自身更改为 self.mySubViewName,如下所示:

    func addGestureRecognizer() {
        let singleTap = UITapGestureRecognizer(target: self.addingItemView, action: #selector(self.handleTap(_:)))
        singleTap.cancelsTouchesInView = false
        singleTap.numberOfTapsRequired = 1
        self.view.addGestureRecognizer(singleTap)
    }

    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
        self.view.endEditing(false)
    }

这样 GestureRecognizer 就可以开始正确使用子视图按钮,但无法使用主视图。例如,当我试图关闭搜索栏的键盘时,我开始收到 "Unrecognized selector was sent" 错误。我尝试实现单独的函数 addGestureRecognizerForSubView,但仍然出现 "Unrecognized selector was sent..." 错误。

也尝试添加这个:

extension MenuTableViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        return touch.view == self.addingItemView
    }
}

但没有任何变化。

我在这里检查了很多答案,但找不到我的案例。有人可以建议吗?我可以分享我的 ViewController class,但它太重了,以编程方式添加的子视图看起来很丑 :)

在警报后面添加一个子视图并向其添加手势而不是self.view

    let singleTap = UITapGestureRecognizer(target: self.otherView, action: #selector(self.handleTap(_:)))
    singleTap.cancelsTouchesInView = false
    singleTap.numberOfTapsRequired = 1
    self.otherView.addGestureRecognizer(singleTap)

编辑:您将其添加到子视图的建议是正确的

    let singleTap = UITapGestureRecognizer(target: self.addingItemView, action: #selector(self.handleTap(_:)))
    singleTap.cancelsTouchesInView = false
    singleTap.numberOfTapsRequired = 1
    self.view.addGestureRecognizer(singleTap)

但是你还是把手势加到self.view这里

      self.view.addGestureRecognizer(singleTap)

改为

      self.addingItemView.addGestureRecognizer(singleTap)