UILongPressGestureRecognizer tuşa basıldığında iki kez çağrılır


359

Kullanıcının 2 saniye boyunca aşağı bastırıp basmadığını tespit ediyorum:

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

Uzun basışımı şu şekilde idare ederim:

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

2 saniyeden daha uzun süre bastığımda "double oo" metni iki kez yazdırılıyor. Bu neden? Nasıl düzeltebilirim?

Yanıtlar:


684

UILongPressGestureRecognizer sürekli bir olay tanıyıcıdır. Bunun olayın başlangıcı, ortası mı yoksa sonu mu olduğunu görmek için duruma bakmanız ve buna göre hareket etmeniz gerekir. yani başlangıçtan sonra tüm olayları atabilir veya sadece ihtiyacınız olan harekete bakabilirsiniz. Gönderen Sınıf Referans :

Uzun basma hareketleri süreklidir. İzin verilen parmak sayısına (numberOfTouchesRequired) belirli bir süre (minimumPressDuration) basıldığında ve dokunuşlar izin verilen hareket aralığının (allowableMovement) ötesine geçmediğinde hareket başlar (UIGestureRecognizerStateBegan). Hareket algılayıcı, bir parmak hareket ettiğinde Değiştir durumuna geçer ve parmaklardan herhangi biri kaldırıldığında sona erer (UIGestureRecognizerStateEnded).

Artık Devleti Böyle Takip Edebilirsiniz

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

4
Bir sonraki cevap nasıl yapılacağını gösteriyor, ancak ayrıntılı açıklaması ve belgelere bağlantısı nedeniyle bu cevabı +1 olarak verdim.
Matt Connolly

2
Bir kod örneğinde, yalnızca belgelere bağlanmak yerine daha yararlı olabilir. Kod snippet'imi aşağıya gönderdim. UIGestureRecognizerStateBegan durumunu kontrol edin.
Paul Solt

UIGestureRecognizerStateChanged
Rajneesh071

@joelm beni kurtardın)
Evgeniy Kleban

Swift 4 için: if (sender.state == UITapGestureRecognizer.State.ended) {// Hareketin Sonu baskısında istediğiniz her şeyi yapın ("\ n * uzun süreli * \ n")}
Ravi

117

UILongPressGestureRecognizer'ın durumunu kontrol etmek için selector yöntemine bir if ifadesi eklemeniz yeterlidir:

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

13
Eğer / else bloke olursa bunu istemezsiniz, çünkü Ended'den daha fazla durum vardır. Durum değiştiğinde "Uzun basış algılandı" birden çok kez yazdırılır. Bunun yerine UIGestureRecognizerStateBegan durumunu kontrol edin.
Paul Solt

2
Birisi en iyi yorumun söylediklerine uyacak şekilde bu cevabı gerçekten düzenlemelidir. Durduğu gibi sağlanan kod çalışmaz.
Declan McKenna

75

Her durum için farklı davranışlar olduğundan doğru durumu kontrol etmeniz gerekir. Büyük olasılıkla UIGestureRecognizerStateBeganile devlete ihtiyacınız olacak 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
    }
}

2
Durumun değişmesi için parmaklarınızı hareket ettirmeniz gerekiyor gibi görünüyor; bu doğru mu?
12'de Arcadian

Parmakları hareket ettirirken StateChanged'i tetikleyebilir, bu benim test kodumda yaptığım gibi görünüyor.
Paul Solt

UIGestureRecognizerStateBegan sadece bir kez çağrılıyor gibi görünüyor, bu benim durumum için mükemmel bir düğmeye basıldığında bir diyalog göstermeye çalışıyor. Diğer eyaletler birden çok kez çağrılır. Teşekkürler!
Damian

19

Sadece şunu deneyin:

Objective-C

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

Hızlı 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.");
        }
}

14

Swift ile nasıl baş edeceğiniz aşağıda açıklanmıştır:

func longPress(sender:UILongPressGestureRecognizer!) {

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

13

Swift 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

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

6

hareket işleyiciniz her hareket durumu için çağrı alır. bu nedenle her durum için bir kontrol yapmanız ve kodunuzu gerekli duruma getirmeniz gerekir.

Kişi-if-else durumunda anahtar-kasasını kullanmayı tercih etmelidir:

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;
         }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.