如何配置Tap手势识别器,使UIButton点击时不收起键盘?
解决点击登录按钮时键盘误收起的问题
嘿,我懂你的困扰!现在的问题是那个全局的gestureRecognizer(_:shouldReceive:)方法根本没和你的tap手势关联上,导致tap手势会接收按钮的触摸事件——先触发收起键盘,反而干扰了按钮的点击逻辑。咱们把代码调整一下就能解决:
修复思路
把手势识别器的代理方法移到UIViewController的扩展里,同时给tap手势设置代理,这样就能精准控制哪些触摸会触发收起键盘的动作:只有点击按钮外的区域才收键盘,按钮点击完全不受影响。
修改后的完整代码
extension UIViewController: UIGestureRecognizerDelegate { func hideKeyboardWhenTappedAround() { let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) tap.cancelsTouchesInView = false tap.delegate = self // 关键:给tap手势设置代理 view.addGestureRecognizer(tap) } @objc func dismissKeyboard() { view.endEditing(true) } // 把代理方法移到扩展内部,替代原来的全局函数 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { // 检查触摸的视图是不是按钮,或者按钮的子视图(比如按钮里的文字标签) let isButtonTouch = touch.view is UIButton || touch.view?.isDescendant(of: UIButton()) == true return !isButtonTouch } }
为什么这样有效?
- 给tap手势设置
delegate = self后,gestureRecognizer(_:shouldReceive:)会在手势触发前被调用,用来判断是否要响应这次触摸。 - 当触摸的是按钮(或按钮的子控件)时,返回
false——tap手势直接忽略这次触摸,不会调用dismissKeyboard,键盘保持弹出状态,按钮的点击事件能正常触发。 - 只有触摸按钮以外的区域时,返回
true,tap手势生效,自动收起键盘。
额外适配(如果有自定义按钮)
如果你用了继承自UIButton的自定义按钮,可以把判断逻辑改成这样,确保自定义按钮也能被识别:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { return !(touch.view?.isKind(of: UIButton.self) == true) }
内容的提问来源于stack exchange,提问作者TillMoss
相关产品推荐
相关产品推荐

