UILongPressGestureRecognizer dipanggil dua kali saat menekan ke bawah

359

Saya mendeteksi apakah pengguna telah menekan selama 2 detik:

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

Inilah cara saya menangani pers lama:

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

Teks "dua kali lipat" akan dicetak dua kali ketika saya menekan lebih dari 2 detik. Kenapa ini? Bagaimana saya bisa memperbaikinya?

Sheehan Alam
sumber

Jawaban:

684

UILongPressGestureRecognizer adalah pengenal acara yang berkelanjutan. Anda harus melihat keadaan untuk melihat apakah ini awal, tengah atau akhir acara dan bertindak sesuai dengannya. yaitu Anda dapat membuang semua acara setelah start, atau hanya melihat gerakan sesuai kebutuhan. Dari Referensi Kelas :

Gerakan tekan lama berlangsung terus menerus. Gerakan dimulai (UIGestureRecognizerStateBegan) ketika jumlah jari yang diizinkan (numberOfTouchesRequired) telah ditekan untuk periode yang ditentukan (minimumPressDuration) dan sentuhan tidak bergerak di luar rentang gerakan yang diijinkan (allowableMovement). Pengenal isyarat transisi ke kondisi Ubah setiap kali jari bergerak, dan itu berakhir (UIGestureRecognizerStateEnded) ketika salah satu jari diangkat.

Sekarang Anda Dapat Melacak Keadaan Seperti Ini

-  (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
     }
  }
joelm
sumber
4
Jawaban berikutnya menunjukkan bagaimana melakukannya, tetapi saya memberikan jawaban ini +1 karena penjelasannya yang terperinci dan tautan ke dokumentasi.
Matt Connolly
2
Bisa lebih membantu dengan contoh kode, daripada menautkan hanya ke dokumentasi. Saya telah memposting cuplikan kode saya di bawah ini. periksa status UIGestureRecognizerStateBegan.
Paul Solt
UIGestureRecognizerStateChanged
Rajneesh071
@ Joelm kau menyelamatkanku)
Evgeniy Kleban
Untuk Swift 4: if (sender.state == UITapGestureRecognizer.State.ended) {// Lakukan Apa pun yang Anda inginkan pada hasil cetak Akhir Gesture ("\ n * longpressed * \ n")}
Ravi
117

Untuk memeriksa keadaan UILongPressGestureRecognizer cukup tambahkan pernyataan if pada metode pemilih:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {    
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}
Dan
sumber
13
Anda tidak ingin itu jika / selain itu diblokir, karena ada lebih banyak status daripada Berakhir. "Tekan lama terdeteksi" akan mencetak beberapa kali saat status berubah. Sebagai gantinya, periksa kondisi UIGestureRecognizerStateBegan.
Paul Solt
2
Seseorang harus benar-benar mengedit jawaban itu agar sesuai dengan apa yang dikatakan komentar teratas. Seperti berdiri kode yang diberikan tidak berfungsi.
Declan McKenna
75

Anda perlu memeriksa status yang benar, karena ada perilaku yang berbeda untuk setiap negara. Kemungkinan besar Anda akan membutuhkan UIGestureRecognizerStateBegannegara dengan 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
    }
}
Paul Solt
sumber
2
Sepertinya Anda harus menggerakkan jari Anda untuk mengubah keadaan; Apakah itu benar?
Arcadian
Mungkin memicu StateChanged ketika menggerakkan jari, yang terdengar mirip dengan apa yang saya lakukan dalam kode pengujian saya.
Paul Solt
UIGestureRecognizerStateBegan tampaknya hanya dipanggil satu kali yang sempurna untuk situasi saya mencoba menampilkan dialog tentang mendeteksi pers lama pada tombol. Negara-negara lain dipanggil beberapa kali. Terima kasih!
Damian
19

Coba saja ini:

Objektif-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.");
        }
}
Rajesh Loganathan
sumber
14

Berikut cara mengatasinya di Swift:

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}
Raj
sumber
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")
    }
fozoglu
sumber
6

penangan isyarat Anda menerima panggilan untuk setiap kondisi gerakan. jadi Anda perlu memberi tanda centang untuk setiap negara bagian dan memasukkan kode Anda dalam kondisi yang diperlukan.

Seseorang harus lebih suka menggunakan sakelar alih-alih-jika:

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;
         }
}
Pankaj Wadhwa
sumber