2011-11-03 101 views
1

我的iPad应用程序中的视图表现得好像当用户在该视图中启动此类手势时,它们阻止其超级视图的手势识别器发射。触摸子视图时不应该UIRecognizers触发?

这是预期吗? 我该如何去除屏蔽行为? 调试手势识别器的最佳做法是什么?

在更多的细节:

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

形状作为主视图的子视图实现。当用户在主视图中长按双击时,我的代码会创建一个形状子视图,并将其添加到主视图。形状视图可以使用长单点击识别器移动。所以我还附加了一个手势识别器,用于每个形状视图的长单拍。这非常有效:形状视图被调用并让用户在画布中移动它。但是,当用户在形状视图中长时间双击时,什么都不会发生:形状视图不会被调用,这是预期的,因为它没有用于长双击的姿势识别器。但主要观点也不被称为。我曾经想过,由于手势没有被形状视图所识别,那么它会在响应者链中传播到主视图。但是这并没有发生。

我的意图是让用户将重叠形状添加到主视图,以便在形状上长双击也会将新形状添加到主视图。

我可能错过了什么?

我当然可以添加一个长双击识别器来塑造视图,并从那里将手势转发到主视图或直接处理手势,方式与我在主视图中所做的相似。

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

感谢您的任何建议。

+0

当你长时间双击一个子视图时,它会触发单一长按? –

+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我没有测试过这一点,但我后来测试它,我会更新。

+0

没错,就是这样。我没有配置识别器的依赖关系。我以某种方式认为其他观点的承认者是独立的,而他们不是。使耦合太强,我的口味,但我真的不明白如何避免这种情况。 –

相关问题