touchesEnded with addGesture

时间:2013-10-05 02:41:57

标签: ios uigesturerecognizer uipangesturerecognizer c4

我试图在手势后触发触发。我已经包含了一个代码片段,其中触发了theBegan和touchesEnded都可以触发。我用下面的代码得到了两个奇怪的行为。当我平移时,打印开始并刷过结束。当我触摸画布时,我得到一个开头和两个结束消息。

我已经尝试删除touchesBegan以确保它与touchesEnded不冲突,但行为是相同的。

#import "C4WorkSpace.h"

@implementation C4WorkSpace

-(void)setup
{
    [self addGesture:PAN name:@"pan" action:@"bbb:"];
    [self gestureForName:@"pan"].delaysTouchesBegan = NO;
    [self gestureForName:@"pan"].delaysTouchesEnded = NO;
}

-(void) bbb : (UIGestureRecognizer *) recognizer
{
    if(recognizer.state == UIGestureRecognizerStateEnded)
        C4Log(@"Swipe Ended");
}
-(void) touchesBegan
{
    C4Log(@"Begin");
}
-(void) touchesEnded
{
    C4Log(@"End");
}

@end

1 个答案:

答案 0 :(得分:4)

这是一个直接涉及UIGestures架构工作方式的问题。 delaysTouchesEnded基本延迟touchesEnded:withEvent:发送邮件并将此值设置为NO并不一定意味着将触发事件。

来自文档:

  

如果手势识别器随后识别出其手势,则这些   触摸对象被取消(通过touchesCancelled:withEvent:   信息)。如果手势识别器无法识别其手势,   窗口在视图的调用中传递这些对象   touchesEnded:withEvent:方法。将此属性设置为NO以进行触摸   UITouchPhaseEnded中的对象在传递给视图时   手势识别器正在分析相同的触摸。

在您的代码段中,touchesBegantouchesEnded实际上无法启动。发生的事情是,您是否会停止“延迟”该手势是否允许 touchesBegantouchesEnded可用于解雇。

delaysTouchesBegan设置为NO,会发生以下情况:

  1. 触碰发生
  2. 手势拦截
  3. 手势被识别
  4. 实际上发生了
  5. touchesBegan(因为识别出手势)
  6. 没有延迟,touchesBegan开火
  7. 使用delaysTouchesEnded touchesEnded的触发取决于手势是否成功完成...与前一种情况不同,touchesBegan总是在手势开始时实际发生。

    在这种情况下会发生以下情况:

    1. 手势被识别
    2. 手势成功完成
    3. 手势CANCELS触及手势发生的视图(这是UIGestureRecognizer的预期行为
    4. ... touchesEnded发生在:

      1. 手势被识别
      2. 手势完成UNSUCCESSFULLY
      3. touchesEnded被解雇
      4. 如果您触摸了代码,请在不移动手指的情况下握住手势,然后在touchesEnded被触发后稍微释放。原因是PAN无法成功完成,并允许touchesEnded触发。

        一种不同的方法

        您正在使用手势,因此您想要发生的任何互动都应考虑到您正在使用的手势......也就是说,当您开始使用手势时,请尝试并根据< strong>手势,知道它将介于您正在触摸的视图与其固有的touchesBegan等方法之间。

        底线

        您的bbb:方法非常完美。

        使用手势时,通过这样的方法来确定手势的各种状态。 这就是你想要使用手势的方式。

        请尝试以下代码:

        #import "C4WorkSpace.h"
        
        @implementation C4WorkSpace
        -(void)setup
        {
            [self addGesture:PAN name:@"pan" action:@"bbb:"];
            [self gestureForName:@"pan"].delaysTouchesBegan = NO;
            [self gestureForName:@"pan"].delaysTouchesEnded = NO;
        }
        
        -(void) bbb : (UIGestureRecognizer *) recognizer {
            if(recognizer.state == UIGestureRecognizerStateBegan) {
                C4Log(@"PAN Begin");
            }
            if(recognizer.state == UIGestureRecognizerStateEnded) {
                C4Log(@"PAN ended");
            }
        }
        
        -(void)touchesBegan {
            C4Log(@"A touch began");
        }
        
        -(void)touchesEnded {
            C4Log(@"A touch ended");
        }
        
        -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
            C4Log(@"A touch cancelled");
        }
        
        @end
        

        请注意,在TOUCH手势后,BEGIN事件会被取消?这就是touchesEnded永远不会被解雇的原因,因为当GESTURE开始时,系统会识别出“触摸”并不是真正的触摸,而且实际上是一种手势。