2011-07-19 79 views
2

我有2个手势识别器,当触发时需要触发相同的动画。UIGestureRecognizer完成后执行

我有2个布尔值,每个布尔值为1,当手势被识别时设置为yes。

我的问题是我需要能够检查一个识别器,看看其他识别器是否被触发。

我目前做以下

[self registerRecognizer:swipeRecognizerRight 
     onRecognizedBlock:^(UIGestureRecognizer *recognizer) { 
    NSLog(@"pulled to right"); 
    leftPulled = TRUE; 

    if (rightPulled) { 
     [self->delegate executeActionString:someAnimation];  
    } 

    leftPulled = FALSE; 
}]; 

与同为右边的识别。

leftPulled和rightPulled是实际的对象,一个在左边,一个在右边。

我的问题是,一个识别器在另一个识别器之前被执行,所以当两者都被识别并且触发动画时将永远不会出现这种情况。

这怎么解决?某种类型的计时器,还是有一种编码识别器的方法,以便可以同时识别两者,然后触发动画?

回答

3

你会发现你的方式,我认为,在UIGestureRecognizerDelegate协议方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)g1 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)g2; 

你的情况,这种方法应该返回在这两种情况下YES...:g1 ...:g2...:g2 ...:g1),让两个手势的识别同时以g1g2开头。

+0

问题是每个识别器具有的完成块。其中一个完成之前,我不知道除了完成块之外,还有什么可以设置布尔值。它甚至有可能吗?我希望应用知道什么时候两个手势被同时识别,以便我可以触发某些东西。 – user773578

+0

好吧,我现在明白了。你应该怎么做我认为是在每个块中检查其他GR的'state'属性。如果另一个状态等于“UIGestureRecognizerStateRecognized”,那么你知道另一个手势是否已被识别。 – 2011-07-19 21:19:34

+0

完美!!!!!!!!! – user773578

0

你对一个计时器的想法可能是正确的。你需要拿出一个阈值持续时间,并且只需使用performSelector:afterDelay:,或GCD and a block *(链接到SO问题)重置标志:

int64_t threshold = 1000000; // In nanoseconds 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, threshhold),  
       dispatch_get_main_queue(), 
       ^{ leftPulled = FALSE; }); 

*我相信这对于非常小的延迟更准确比NSTimer,虽然我不确定。