UIScrollView与UITableView共存时点击关闭功能异常问题排查
解决UIScrollView空白区域点击关闭,UITableView正常交互的问题
针对你的场景,有两种可靠的解决方案可以实现仅点击UIScrollView空白区域时关闭页面,同时保证UITableView和view1的正常交互:
方案一:利用手势代理过滤触摸事件
通过实现UIGestureRecognizerDelegate的方法,判断触摸点是否落在view1或UITableView范围内,若在则阻止手势响应:
- 确保你的ViewController遵循
UIGestureRecognizerDelegate协议:
class YourViewController: UIViewController, UIGestureRecognizerDelegate { // ... 你的现有代码 }
- 实现代理方法,过滤触摸事件:
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,提问作者Марат Саляхетдинов
相关产品推荐
相关产品推荐

