How can I shorten the time "delayTouchesBegan" delays touchesBegan?

ios, iphone, objective-c, touchesbegan, uitapgesturerecognizer

Solution

I'd solve it with changing `UITapGestureRecognizer` to `UILongPressGestureRecognizer`. The title of those two is a bit misleading but with `UILongPressGestureRecognizer` you can set the `minimumPressDuration`:

The minimum period fingers must press on the view for the gesture to be recognized.

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

Problem

In one of my view controllers I have several views that contain a UITapGestureRecognizer, along with an implementation of `touchesBegan`. I need to prioritize the taps over `touchesBegan` so I set the `delaysTouchesBegan` property of the gesture recognizers to `YES`. This works correctly, but there's one problem: the gesture recognizer delays `touchesBegan` for too long. According to the documentation: When the value of the property is YES, the window suspends delivery of touch objects in the UITouchPhaseBegan phase to the view. If the gesture recognizer subsequently recognizes its gesture, these touch objects are discarded. If the gesture recognizer, however, does not recognize its gesture, the window delivers these objects to the view in a touchesBegan:withEvent: message (and possibly a follow-up touchesMoved:withEvent: message to inform it of the touches’ current locations). The problem basically is that when the gesture recognizer does not recognize the gesture and delivers these objects to `touchesBegan`, that operation takes too long. Is there anyway to expedite it, or is it just that the processing of the gesture to determine whether it's a tap is intensive and is impossible to shorten? Edit: Here's some more info. This is the code I use to setup the gesture recognizer: ``` 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]; ```

Original source