it-swarm.com.de

UILongPressGestureRecognizer wird beim Drücken zweimal aufgerufen

Ich stelle fest, ob der Benutzer 2 Sekunden lang gedrückt hat:

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

So gehe ich mit der langen Presse um:

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
    NSLog(@"double oo");
}

Der Text "double oo" wird zweimal gedruckt, wenn ich länger als 2 Sekunden gedrückt halte. Warum ist das? Wie kann ich das beheben?

346
Sheehan Alam

UILongPressGestureRecognizer ist eine kontinuierliche Ereigniserkennung. Sie müssen sich den Zustand ansehen, um festzustellen, ob dies der Beginn, die Mitte oder das Ende des Ereignisses ist, und entsprechend handeln. Sie können alle Ereignisse nach dem Start wegwerfen oder die Bewegung nur nach Bedarf betrachten. Aus dem Klassenreferenz :

Langes Drücken hält an. Die Geste beginnt (UIGestureRecognizerStateBegan), wenn die Anzahl der zulässigen Finger (numberOfTouchesRequired) für den angegebenen Zeitraum gedrückt wurde (minimumPressDuration) und die Berührungen den zulässigen Bewegungsbereich (allowableMovement) nicht überschreiten. Der Gestenerkenner wechselt bei jeder Bewegung eines Fingers in den Status Ändern und endet (UIGestureRecognizerStateEnded), wenn einer der Finger angehoben wird.

Jetzt können Sie den Zustand so verfolgen

-  (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
     }
  }
664
joelm

Um den Status des UILongPressGestureRecognizer zu überprüfen, fügen Sie einfach eine if-Anweisung zur Auswahlmethode hinzu:

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

Sie müssen den korrekten Status überprüfen, da es für jeden Status unterschiedliche Verhaltensweisen gibt. Höchstwahrscheinlich benötigen Sie den Status UIGestureRecognizerStateBegan mit dem Status 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
    }
}
73
Paul Solt

Probieren Sie einfach Folgendes aus:

Ziel-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.");
        }
}
18

So geht es in Swift:

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}
13
Raj

Swift 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

    if sender.state == .ended {
        print("Long press Ended")
    } else if sender.state == .began {
        print("Long press detected")
    }
12
fozoglu

ihr Gestenhandler erhält einen Anruf für jeden Gestenstatus. Sie müssen also für jeden Status eine Prüfung durchführen und Ihren Code in den erforderlichen Status versetzen.

Man muss es vorziehen, Switch-Case zu verwenden, wenn-else:

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

-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
        switch(gesture.state){
          case UIGestureRecognizerStateBegan:
               NSLog(@"State Began");
               break;
          case UIGestureRecognizerStateChanged:
               NSLog(@"State changed");
               break;
          case UIGestureRecognizerStateEnded:
               NSLog(@"State End");
               break;
          default:
               break;
         }
}
5
pankaj