Swift中点击屏幕如何收起键盘?点击Scroll View无响应求助
解决点击UIScrollView区域收起键盘的问题
你遇到的这个情况其实很典型——touchesBegan(_:with:)之所以只在ScrollView外生效,是因为UIScrollView会拦截并处理触摸事件,不会把事件传递给它的父视图(也就是你的ViewController的view)。下面给你几个实用的解决方案,按需选择:
方案1:给ScrollView添加点击手势
这个方法简单直接,不需要自定义控件,适合快速实现:
- 在
viewDidLoad里给你的ScrollView添加一个UITapGestureRecognizer:
override func viewDidLoad() { super.viewDidLoad() let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleScrollViewTap)) // 关键:设置这个属性为false,避免手势拦截ScrollView内可交互控件(比如按钮、输入框)的触摸事件 tapGesture.cancelsTouchesInView = false yourScrollView.addGestureRecognizer(tapGesture) }
- 实现对应的处理方法:
@objc private func handleScrollViewTap() { self.view.endEditing(true) }
方案2:自定义ScrollView重写触摸事件
如果你的项目里多个地方都需要这个功能,自定义一个ScrollView会更方便:
- 创建一个继承自
UIScrollView的自定义类:
class DismissKeyboardScrollView: UIScrollView { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) // 收起键盘 self.endEditing(true) } }
- 在Storyboard或者代码中,把原来的ScrollView替换成这个自定义类。比如在Storyboard里,选中ScrollView,在Identity Inspector里把Class改成
DismissKeyboardScrollView。
方案3:全局点击收起键盘(通用所有场景)
如果你想让整个APP内点击任何空白区域都收起键盘,可以用这个方法:
在你的ViewController的viewDidLoad里添加一个全局的点击手势到window上:
override func viewDidLoad() { super.viewDidLoad() let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) tapGesture.cancelsTouchesInView = false UIApplication.shared.keyWindow?.addGestureRecognizer(tapGesture) } @objc private func dismissKeyboard() { UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to: nil, from: nil, for: nil) }
这个方法会让当前的第一响应者(也就是正在编辑的输入框)放弃第一响应状态,从而收起键盘。
注意事项
- 如果你的ScrollView里有
UITextField或UITextView,点击这些输入框本身不应该收起键盘,上面的方案都已经考虑到了(比如手势的cancelsTouchesInView = false,或者自定义ScrollView里调用super.touchesBegan),不会影响正常的编辑操作。 - 如果你用的是
UITableView或UICollectionView(它们都是UIScrollView的子类),上面的方案同样适用,只需要把ScrollView换成对应的TableView/CollectionView即可。
内容的提问来源于stack exchange,提问作者Carbanim
相关产品推荐
相关产品推荐

