关于iOS手势响应的问题

问题描述:
如图,我在进行一个阅读器项目的开发时,遇到了一个问题,我需要在点击红色区域时弹出一个菜单,因此我在该区域加了一个View,然而,当我在这个区域滑动时,滑动手势被红色区域拦截,手势无法传递到下面的UIPageViewController的View上。
图片描述

我希望能够使得这个区域只对点击事件作出响应而忽略滑动手势,请问应该如何处理。

阅读 2.4k
1 个回答

简单版: 两步走

通过传递链,把弹窗的响应,交给 PagedController 的内容视图

class RedView: UIView {

    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let controller = self.next?.next as! BaseViewController
        
        return controller.children[0].view
    }
}

然后,在内容视图中计算坐标,处理事件

class ViewController: UIPageViewController {
    
    
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        for touch in touches{
            let point = touch.location(in:view)
            let contentRect = CGRect(origin: CGPoint(x: 100, y: 100), size: CGSize(width: 200, height: 200))
            if contentRect.contains(point){
                print("去")
            }
        }
        
    }

}

简单版代码: https://gitee.com/dengshaoxia...





因为是菜单,为了避免大量的数学计算,为了避免还要做手机适配

在菜单下面,PagedController 的视图顶层添加类似透明菜单,坐标和大小一致。
然后就重写菜单上每一个按钮的 hitTest, 将其 responder 交给下层的透明菜单。
一一对应。
这样就方便了。

只需要建设同样的结构,和重写 hitTest 方法。

touchesBegan ,这就不用重写了。







你说的问题不存在,
系统本来就是这样默认实现的

更多见 demo:
https://gitee.com/dengshaoxia...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题