5

我有一个名为 view1 的 UIView。view1 有一个名为 subview 的子视图。我添加UITapGestureRecognizer到子视图如下:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
[subview addGestureRecognizer:recognizer];

如果我点击了 subview 和 view1 之间重叠的区域,则调用了 handleTap 方法。但是,如果我在 view1 之外的子视图上点击了一个区域,那么 handleTap 永远不会被调用。这种行为对吗?如果没有,有什么建议我应该检查什么?

顺便说一句: UIPanGestureRecognizer 工作正常。它不表现出上述行为。

在此处输入图像描述

4

3 回答 3

2

这是 UiView 的默认行为,子视图应该在父视图范围内。如果您想要不同的东西更好,您可以创建顶视图的自定义子类并覆盖(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

于 2012-06-02T22:13:45.873 回答
1

您需要自定义父视图并更改它处理触摸的方式。有关更多详细信息,请参阅此问题

于 2012-06-02T22:11:44.907 回答
0

我发现关于覆盖 pointInside:withEvent: 的答案缺乏解释或实施的细节。在最初的问题中,当用户点击黑色的未标记区域/视图(我们将其称为 view2)时,事件框架只会触发 hitTest:withEvent: 主窗口向下穿过 view2(及其直接子视图) ,并且永远不会为 view1 命中它,因为在 pointInside:point 中测试的点超出了 view1 的框架范围。为了让 subview1 注册手势,您应该覆盖 view2 的 hitTest:withEvent 实现以包括对 subview 的 pointInside:point 的检查

//This presumes view2 has a reference to view1 (since they're nested in the example).
//In scenarios where you don't have access, you'd need to implement this
//in a higher level in the view hierachy

//In view2
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let ptRelativeToSubviewBounds = convert(point, to: view1.subview)
        if view1.subview.point(inside:ptRelativeToSubviewBounds, with:event){
            return view1.subview
        }
        else{
            return super.hitTest(point, with: event)
        }
于 2018-08-18T00:34:32.290 回答