触摸子视图时,UIRecognizers是否应该触发?

时间:2011-11-03 11:10:41

标签: ios cocoa-touch uigesturerecognizer subview

我的iPad应用程序中的视图表现得好像它们阻止了超级视图的手势识别器在用户在该视图中启动此类手势时触发。

这是预期的吗? 如何消除屏蔽行为? 调试手势识别器的好方法是什么?

更多细节:

我的应用程序的主“画布”视图,让用户通过“长双击”为其添加形状。我将这种手势的手势识别器附加到主视图。这非常有效:主视图被调用,并通过向主视图添加形状来做出反应。

形状作为主视图的子视图实现。当用户在主视图中长按双击时,我的代码会实例化一个形状子视图,并将其添加到主视图中。可以使用长单击识别器移动形状视图。所以我还附加了一个手势识别器,用于每个形状视图的长单击。这非常有效:形状视图被调用,并允许用户在画布中移动它。

然而,当用户在形状视图中长按双击时,没有任何反应:未调用形状视图,这是预期的,因为它没有用于长双击的手势识别器。但主要观点也没有被称为。我曾经想过,由于形状视图无法识别手势,因此它会在响应者链中向上传播到主视图。但这不会发生。

我的目的是让用户将重叠的形状添加到主视图中,这样在形状上长按两次也会为主视图添加新的形状。

我可以错过什么?

我当然可以添加一个长双击识别器来形成视图,然后从那里将手势转发到主视图或直接以类似于我在主视图中的方式处理手势。 / p>

但这听起来很浪费,更重要的是,我想了解这种行为。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

据我所知,它应该是开箱即用的。

要确保两个gestureRecognizers都没有被解雇,您需要执行以下操作:

[longPress requireGestureRecognizerToFail:doubleLongPress];

<强>更新

这里只是免费样式,但如果您想将手势限制在一个视图中,您可以尝试使用手势代理(只有在触摸的视图为self.view时才会响应)

self.myGesture.delegate = self;

在您的控制器中执行以下操作:

//.h
@interface MyController : UIViewController <UIGestureRecognizerDelegate>
// ...
@end

//.m
@implementation MyController

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
    BOOL shouldReceiveTouch = YES;

    if (gestureRecognizer == self.myGesture) {
        shouldReceiveTouch = (touch.view == self.view);
    }

    return shouldReceiveTouch;
}

//...

@end

NB 我没有对此进行过测试,但是稍后测试时我会更新。