我试图让 touchesEnded 在一个手势后触发。我已经包含了一个代码片段,其中 touchesBegan 和 touchesEnded 都可以触发。我用下面的代码得到两个奇怪的行为。当我平移它打印开始和刷卡结束。当我触摸 Canvas 时,我会收到一条开始消息和两条结束消息。

我尝试删除 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

最佳答案

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

从文档:



在您的代码片段中,touchesBegantouchesEnded 实际上并未启用。发生的事情是您正在禁用手势是否允许 touchesBegantouchesEnded 可用于触发的“延迟”。
delaysTouchesBegan 设置为 NO 时,会发生以下情况:

  • 触摸发生
  • 手势拦截
  • 手势被识别
  • touchesBegan 确实发生了(因为手势识别)
  • 没有延迟,touchesBegan 触发

  • 使用 delaysTouchesEnded 时,touchesEnded 的触发取决于手势是否成功完成......与之前的 touchesBegan 总是实际发生在手势开始的情况不同。

    在这种情况下会发生以下情况:
  • 手势正在被识别
  • 手势成功完成
  • 手势 CANCELS 触摸发生手势的 View (这是 UIGestureRecognizer
  • 的预期行为

    ... touchesEnded 发生在:
  • 手势正在被识别
  • 手势未成功完成
  • touchesEnded 被解雇

  • 用你的代码,如果你触摸,保持手势而不移动你的手指,然后在 touchesEnded 被触发一段时间后释放。原因是 PAN 没有成功完成并允许 touchesEnded 触发。

    不同的方法

    您正在使用手势,因此您希望发生的任何交互都应考虑您正在使用的手势......也就是说,当您开始使用手势时,请尝试考虑 手势 ,知道它将介于您正在触摸的 View 与其固有的 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 开始时,系统会识别出“触摸”并不是真正的触摸,而是真正的手势。

    关于ios - touchesEnded with addGesture,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19193406/

    10-12 06:48