【问题标题】:iOS addGestureRecognizer with cancelsTouchesInView = false does not work with subview buttons带有 cancelsTouchesInView = false 的 iOS addGestureRecognizer 不适用于子视图按钮
【发布时间】:2018-07-21 03:49:10
【问题描述】:

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

// 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 的主视图。键盘被解除,触摸被转换为视图的对象 - 按钮等等。

但我添加了子视图,它与 AlertView 类似,带有几个 UITextField 和 UIButton。这是一个问题。当出现子视图并且我正在点击此子视图的任何按钮时-gestureRecognizer 会做出反应并且键盘会消失。但没有其他事情发生。所以我必须第二次点击按钮才能按下它。

我尝试将 UITapGestureRecognizer 的目标从 self 更改为 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 开始正常使用子视图按钮,但无法使用主视图。例如,在尝试关闭搜索栏的键盘时,我开始收到“发送了无法识别的选择器”错误。我尝试实现单独的函数 addGestureRecognizerForSubView,但仍然收到“发送了无法识别的选择器...”错误。

也尝试添加这个:

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

但没有任何变化。

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

【问题讨论】:

    标签: ios swift uigesturerecognizer


    【解决方案1】:

    在警报后面添加一个子视图并将手势添加到它而不是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)
    

    【讨论】:

    • 嘿!它看起来像正确的答案,但是当我实现这两种方法时它不起作用 - 主视图和子视图的 self.view.addGestureRecognizer(singleTap) 和 self.addingItemView.addGestureRecognizer(singleTap) ,第二个不起作用。并且 shouldRecognizeSimultaneouslyWith otherGestureRecognizer 在这里没有帮助:(
    • 我的主视图有 searchBar,我想使用 GestureReognizer 来隐藏键盘。我想要另一个 GestureRecognizer 来隐藏子视图的键盘。
    • 当警报出现时禁用主视图的手势并在您关闭警报后重新启用
    • agrhh... 将继续战斗。无法理解这些识别器和选择器发生了什么。
    • UITableView 也有同样的问题,tableView.delaysContentTouches = false 解决了问题
    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多