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

UIScrollView与UITableView共存时点击关闭功能异常问题排查

解决UIScrollView空白区域点击关闭,UITableView正常交互的问题

针对你的场景,有两种可靠的解决方案可以实现仅点击UIScrollView空白区域时关闭页面,同时保证UITableView和view1的正常交互:

方案一:利用手势代理过滤触摸事件

通过实现UIGestureRecognizerDelegate的方法,判断触摸点是否落在view1或UITableView范围内,若在则阻止手势响应:

  1. 确保你的ViewController遵循UIGestureRecognizerDelegate协议:
class YourViewController: UIViewController, UIGestureRecognizerDelegate {
    // ... 你的现有代码
}
  1. 实现代理方法,过滤触摸事件:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    // 获取触摸点在控制器根view中的位置
    let touchPoint = touch.location(in: self.view)
    
    // 判断触摸点是否在view1范围内
    let pointInView1 = self.view.convert(touchPoint, to: view1)
    if view1.bounds.contains(pointInView1) {
        return false
    }
    
    // 判断触摸点是否在UITableView范围内
    let pointInTableView = self.view.convert(touchPoint, to: tableView)
    if tableView.bounds.contains(pointInTableView) {
        return false
    }
    
    // 仅当点击空白区域时允许手势响应
    return true
}

这种方法不需要额外添加视图,直接通过坐标判断过滤手势触发条件。

方案二:给空白区域单独添加点击视图

通过在UIScrollView中添加一个铺满全屏的背景视图,将其置于StackView下方,仅给背景视图添加关闭手势:

修改你的settings()方法如下:

func settings() {
    // 创建空白背景视图,铺满UIScrollView
    let backgroundView = UIView()
    scrollView.addSubview(backgroundView)
    backgroundView.translatesAutoresizingMaskIntoConstraints = false
    
    // 添加约束
    NSLayoutConstraint.activate([
        backgroundView.topAnchor.constraint(equalTo: scrollView.topAnchor),
        backgroundView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
        backgroundView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
        backgroundView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
        backgroundView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
    ])
    
    // 将StackView移到背景视图上方,确保view1和TableView能接收触摸事件
    scrollView.bringSubviewToFront(stackView)
    
    // 给背景视图添加点击手势
    let gestureRec = UITapGestureRecognizer(target: self, action: #selector(close))
    backgroundView.addGestureRecognizer(gestureRec)
}

这种方法逻辑更直观,避免了手势冲突的复杂判断,适合布局结构相对简单的场景。


内容的提问来源于stack exchange,提问作者Марат Саляхетдинов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:03:09