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)
我 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)