iphone - UILongPressGestureRecognizer gets called twice when pressing down

ID : 7291

viewed : 167

Tags : iphoneobjective-ccocoa-touchgesture-recognitionuigesturerecognizeriphone





Top 5 Answer for iphone - UILongPressGestureRecognizer gets called twice when pressing down

vote vote

99

UILongPressGestureRecognizer is a continuous event recognizer. You have to look at the state to see if this is the start, middle or end of the event and act accordingly. i.e. you can throw away all events after the start, or only look at movement as you need. From the Class Reference:

Long-press gestures are continuous. The gesture begins (UIGestureRecognizerStateBegan) when the number of allowable fingers (numberOfTouchesRequired) have been pressed for the specified period (minimumPressDuration) and the touches do not move beyond the allowable range of movement (allowableMovement). The gesture recognizer transitions to the Change state whenever a finger moves, and it ends (UIGestureRecognizerStateEnded) when any of the fingers are lifted.

Now You Can Track The State Like This

-  (void)handleLongPress:(UILongPressGestureRecognizer*)sender {      if (sender.state == UIGestureRecognizerStateEnded) {       NSLog(@"UIGestureRecognizerStateEnded");     //Do Whatever You want on End of Gesture      }     else if (sender.state == UIGestureRecognizerStateBegan){        NSLog(@"UIGestureRecognizerStateBegan.");    //Do Whatever You want on Began of Gesture      }   } 
vote vote

81

To check the state of the UILongPressGestureRecognizer just add an if statement on the selector method:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {         if (sender.state == UIGestureRecognizerStateEnded) {         NSLog(@"Long press Ended");     } else if (sender.state == UIGestureRecognizerStateBegan) {         NSLog(@"Long press detected.");     } } 
vote vote

73

You need to check the correct state, since there are different behaviors for each state. Most likely you're going to need the UIGestureRecognizerStateBegan state with the UILongPressGestureRecognizer.

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]                                              initWithTarget:self                                               action:@selector(handleLongPress:)]; longPress.minimumPressDuration = 1.0; [myView addGestureRecognizer:longPress]; [longPress release]; 

...

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {     if(UIGestureRecognizerStateBegan == gesture.state) {         // Called on start of gesture, do work here     }      if(UIGestureRecognizerStateChanged == gesture.state) {         // Do repeated work here (repeats continuously) while finger is down     }      if(UIGestureRecognizerStateEnded == gesture.state) {         // Do end work here when finger is lifted     } } 
vote vote

67

Just try this:

Objective-C

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {      if (sender.state == UIGestureRecognizerStateEnded) {         NSLog(@"Long press Ended");     } else if (sender.state == UIGestureRecognizerStateBegan) {         NSLog(@"Long press detected.");     } } 

Swift 2.2:

func handleLongPress(sender:UILongPressGestureRecognizer) {          if (sender.state == UIGestureRecognizerState.Ended) {             print("Long press Ended");         } else if (sender.state == UIGestureRecognizerState.Began) {             print("Long press detected.");         } } 
vote vote

52

Swift 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {      if sender.state == .ended {         print("Long press Ended")     } else if sender.state == .began {         print("Long press detected")     } 

Top 3 video Explaining iphone - UILongPressGestureRecognizer gets called twice when pressing down







Related QUESTION?