允许点击通过 UITapGestureRecognizer 并到达下面的表格视图[重复]

Posted

技术标签:

【中文标题】允许点击通过 UITapGestureRecognizer 并到达下面的表格视图[重复]【英文标题】:Allow taps to pass through UITapGestureRecognizer and reach table view below [duplicate] 【发布时间】:2020-01-14 23:01:42 【问题描述】:

我正在实现一个搜索控制器,顶部有一个搜索栏,下面有一个显示搜索结果的表格视图。我添加了以下代码,以便当用户点击屏幕时,键盘将被关闭。

override func viewDidLoad() 
    super.viewDidLoad()
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
    self.view.addGestureRecognizer(tapGesture)


@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) 
    if let view = self.view 
        view.endEditing(true)
    

但是,现在当我尝试实现表格视图的didSelectRowAt 方法时,它不起作用,因为上面代码中定义的UITapGestureRecognizer 捕获了触摸事件。理想情况下,我希望 tableview 的触摸优先于上面的代码,这样当用户触摸 tableView 时,didSelectRowAt 被调用,但是当他触摸屏幕上的其他任何地方时,dismissKeyboard 被调用。

【问题讨论】:

这能回答你的问题吗? ScrollView gesture recognizer eating all touch events 是的 - 谢谢 【参考方案1】:

实现 UIGestureRecognizerDelegate,如果触摸在您的 tableView 上,则使用 return false。

override func viewDidLoad() 
    super.viewDidLoad()
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))

    tabGesture.delegate = self

    self.view.addGestureRecognizer(tapGesture)


func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool 
    if touch.view?.isDescendantOfView(self.tableView) == true 
        return false
    
    return true


应该可以解决你的问题

【讨论】:

你也可以touch.view?.isDescendantOfView(self.tableView) ? true : false

以上是关于允许点击通过 UITapGestureRecognizer 并到达下面的表格视图[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pygame:允许点击通过窗口

允许用户通过点击来选择 UIPickerView 行

允许点击通过 UITapGestureRecognizer 并到达下面的表格视图[重复]

禁用输入,允许点击文本框

onBlur事件不允许链接点击进行注册

允许 iframe 后面的元素可点击