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

Swift中点击屏幕如何收起键盘?点击Scroll View无响应求助

解决点击UIScrollView区域收起键盘的问题

你遇到的这个情况其实很典型——touchesBegan(_:with:)之所以只在ScrollView外生效,是因为UIScrollView会拦截并处理触摸事件,不会把事件传递给它的父视图(也就是你的ViewController的view)。下面给你几个实用的解决方案,按需选择:

方案1:给ScrollView添加点击手势

这个方法简单直接,不需要自定义控件,适合快速实现:

  1. 在viewDidLoad里给你的ScrollView添加一个UITapGestureRecognizer:
override func viewDidLoad() {
    super.viewDidLoad()
    
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleScrollViewTap))
    // 关键:设置这个属性为false,避免手势拦截ScrollView内可交互控件(比如按钮、输入框)的触摸事件
    tapGesture.cancelsTouchesInView = false
    yourScrollView.addGestureRecognizer(tapGesture)
}
  1. 实现对应的处理方法:
@objc private func handleScrollViewTap() {
    self.view.endEditing(true)
}

方案2:自定义ScrollView重写触摸事件

如果你的项目里多个地方都需要这个功能,自定义一个ScrollView会更方便:

  1. 创建一个继承自UIScrollView的自定义类:
class DismissKeyboardScrollView: UIScrollView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        // 收起键盘
        self.endEditing(true)
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:56