首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >touchesEnded与addGesture

touchesEnded与addGesture
EN

Stack Overflow用户
提问于 2013-10-05 02:41:57
回答 1查看 1.6K关注 0票数 3

我正试着让touchesEnded在做手势后开火。我已经包含了一个代码片段,在其中touchesBegan和touchesEnded都可以触发。下面的代码有两种奇怪的行为。当我翻盘的时候,它的打印开始和滑动结束。当我触摸画布时,我会得到一个开始和两个结束消息。

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

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-05 21:01:25

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

从医生那里:

如果手势识别器随后识别它的手势,则取消这些触摸对象(通过触摸cancelled :withEvent: message)。如果手势识别器不识别它的手势,窗口将在视图的touchesEnded:withEvent:方法的调用中传递这些对象。将此属性设置为NO,以便在手势识别器分析相同的触摸时,将UITouchPhaseEnded中的触摸对象传递给视图。

在您的代码片段中,实际上没有启用touchesBegantouchesEnded。所发生的事情是,您正在禁用“延迟”是否该手势将允许touchesBegantouchesEnded可用于触发。

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

  1. 触碰
  2. 手势拦截
  3. 手势被识别
  4. touchesBegan确实发生了(因为手势被识别了)
  5. 不延误,touchesBegan火灾

使用delaysTouchesEnded时,touchesEnded的触发取决于手势是否成功完成。与前一种情况不同的是,touchesBegan总是在手势的开头出现。

在这种情况下发生的情况如下:

  1. 手势被认出了
  2. 手势成功完成
  3. 手势取消对发生手势的视图的触摸(这是UIGestureRecognizer的预期行为)。

. touchesEnded发生在:

  1. 手势被认出了
  2. 手势未成功完成
  3. touchesEnded被解雇了

在代码中,如果您按下,保持手势而不移动手指,然后在touchesEnded被触发后释放。原因是PAN没有成功完成并允许touchesEnded启动。

另一种方法

你是在做手势,所以你想要发生的任何互动都应该考虑到你正在做的手势。也就是说,当您开始使用手势时,尝试并考虑手势,知道它将介于您所接触的视图与其固有的touchesBegan等方法之间。

底线

bbb: 方法是完美的。

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

尝试以下代码:

代码语言:javascript
复制
#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永远不会被触发的原因,因为当手势开始时,系统会识别“触摸”不是真正的触摸,而是真正的手势。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19193406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档