You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击绑定IBAction的UIButton时如何同时触发UITapGestureRecognizer

问题解决:UIButton点击同时触发父视图手势与自身IBAction

问题原因

你添加在控制器根视图上的UITapGestureRecognizer默认不会响应UIControl子类(包括UIButton、UISwitch等)的点击事件:系统会优先触发控件自身绑定的点击事件,终止事件向父视图的手势识别器传递,因此点击按钮时只有onClickedButton被调用,手势绑定的收起键盘逻辑不会执行。

解决方案

方案1:修改手势配置(全局生效,适合多按钮场景)

调整手势属性并实现代理方法,即可让父视图手势和控件点击事件同时触发,无需逐个修改按钮代码:

  1. 让当前控制器遵守UIGestureRecognizerDelegate协议
  2. 调整viewDidLoad中的手势初始化逻辑:
override func viewDidLoad() {
    super.viewDidLoad()
    
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap(_:)))
    // 关键配置1:手势识别成功后不取消触摸事件传递,保证按钮点击事件正常触发
    tapGesture.cancelsTouchesInView = false
    // 关键配置2:设置手势代理
    tapGesture.delegate = self
    view.addGestureRecognizer(tapGesture)
}
  1. 实现手势代理方法,过滤输入框点击避免冲突:
extension 你的控制器类名: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        // 点击输入框时不触发手势,避免影响键盘正常唤起
        if touch.view is UITextField {
            return false
        }
        return true
    }
}

配置完成后,点击按钮会先执行手势的收起键盘逻辑,再执行按钮绑定的onClickedButton逻辑,两个需求同时满足。


方案2:按钮事件中手动调用收起键盘(代码量最少,适合少按钮场景)

如果当前页面只有少量按钮需要兼容,不需要修改手势配置,直接在按钮点击方法中补充收起键盘的代码即可:

@IBAction func onClickedButton(_ sender: Any) {
    view.endEditing(true)
    print("aaa")
}

内容的提问来源于stack exchange,提问作者Son

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:03