在我的一个视图控制器中,我有几个包含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];
答案 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:
。
您可以尝试的解决方法是:
请改用手势识别器的cancelTouchesInView
属性。如果您将其设置为YES
,UIView
将立即处理触摸,然后如果手势识别器最终将触摸识别为手势,则视图将被发送-touchesCancelled:withEvent:
,您在此处可以回滚您所做的任何更改。
在cancelTouchesInView
中使用NSTimer
和UIView
。在NSTimer
的{{1}}中启动UIView
,当它触发时,在视图上执行操作。如果视图在计时器触发前发送-touchesBegan:withEvent:
,请取消计时器。
子类-touchesCancelled:withEvent:
并实施您自己的点按识别器:)
我已经做了选项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)
为此,当你的视图被点击时你必须延迟触摸,你可以用所需的时间启动一个计时器,一旦完成,你可以调用所需的方法。