我怎样才能缩短“延迟TouchesBegan”延迟触动的时间?

时间:2013-12-17 06:48:51

标签: ios iphone objective-c uitapgesturerecognizer touchesbegan

在我的一个视图控制器中,我有几个包含UITapGestureRecognizer的视图,以及touchesBegan的实现。我需要优先处理touchesBegan上的点按,因此我将手势识别器的delaysTouchesBegan属性设置为YES。这是正常的,但有一个问题:手势识别器延迟touchesBegan的时间太长。根据{{​​3}}:

  

当属性的值为YES时,窗口会暂停UITouchPhaseBegan阶段中触摸对象到视图的传递。如果手势识别器随后识别其手势,则丢弃这些触摸对象。但是,如果手势识别器无法识别其手势,则窗口会以touchesBegan:withEvent:消息(以及可能的后续touchesMoved:withEvent:消息将这些对象传递给视图,以通知其触摸的当前位置)

问题基本上是当手势识别器无法识别手势并将这些对象传递给touchesBegan时,该操作需要太长时间。反正是为了加快它,还是只是处理手势以确定它是否是一个强大的并且不可能缩短?


编辑:

这里有更多信息。这是我用来设置手势识别器的代码:

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapRecognizer.cancelsTouchesInView = NO;
tapRecognizer.delaysTouchesBegan = YES;
tapRecognizer.delegate = self;
tapRecognizer.numberOfTapsRequired = 1;
tapRecognizer.numberOfTouchesRequired = 1;
[self.someView addGestureRecognizer:tapRecognizer];

3 个答案:

答案 0 :(得分:23)

我通过将UITapGestureRecognizer更改为UILongPressGestureRecognizer来解决此问题。这两个标题有点误导,但UILongPressGestureRecognizer你可以设置minimumPressDuration

  

手指必须按下手势视图的最小时间段   被承认。

UILongPressGestureRecognizer *tapRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tapRecognizer.delegate = self;
tapRecognizer.minimumPressDuration = //Up to you;
[self.someView addGestureRecognizer:tapRecognizer];

答案 1 :(得分:1)

  

无论如何加速它,还是只是处理手势以确定它是否是一个强大的并且不可能缩短?

延迟似乎取决于处理手势需要多长时间,所以是的,无法对其进行调整(您可以记录-touchesBegan:withEvent:以确切了解它何时被调用)。例如,如果您使用UIView触摸UITapGestureRecognizer并且不移动手指,则点击识别器仍然认为您有可能将手指抬到同一位置,这将被识别作为一个水龙头。所以它会一直等到你用手指摇动或抬起它。另一方面,如果你立即平移,UIView几乎没有延迟发送-touchesBegan:withEvent:

您可以尝试的解决方法是:

  1. 请改用手势识别器的cancelTouchesInView属性。如果您将其设置为YESUIView将立即处理触摸,然后如果手势识别器最终将触摸识别为手势,则视图将被发送-touchesCancelled:withEvent:,您在此处可以回滚您所做的任何更改。

  2. cancelTouchesInView中使用NSTimerUIView。在NSTimer的{​​{1}}中启动UIView,当它触发时,在视图上执行操作。如果视图在计时器触发前发送-touchesBegan:withEvent:,请取消计时器。

  3. 子类-touchesCancelled:withEvent:并实施您自己的点按识别器:)

  4. 我已经做了选项1和2的示例。该示例有一个视图,您可以在屏幕上拖动,并且视图具有可以更改视图颜色的点击识别器。如果您点击视图但在释放之前将其拖动一点,您将看到“回滚”在触摸之前将视图捕捉到其位置。如果您将UIGestureRecognizer的{​​{1}}设置为JCPanningView,则在延迟期内看不到任何拖动。

    这可能适用于您,也可能不适用,具体取决于delayResponseToTouch处理其触摸的方式。

    以下是视图控制器的界面(YES):

    UIView

    和实施(JCGestureViewController.h):

    #import <UIKit/UIKit.h>
    
    @interface JCGestureViewController : UIViewController
    @end
    
    @interface JCPanningView : UIView
    @property (nonatomic) BOOL delayResponseToTouch;
    - (void)changeColor;
    @end
    

答案 2 :(得分:-1)

为此,当你的视图被点击时你必须延迟触摸,你可以用所需的时间启动一个计时器,一旦完成,你可以调用所需的方法。