UILongPressGestureRecognizer при натисканні натискає двічі


359

Я виявляю, чи натиснув користувач протягом 2 секунд:

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

Ось як я обробляю тривалий натиск:

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

Текст "подвійний оо" друкується двічі, коли я натискаю кнопку довше, ніж 2 секунди. Чому це? Як я можу виправити?

Відповіді:


684

UILongPressGestureRecognizer - це безперервний розпізнавач подій. Ви повинні подивитися на стан, щоб побачити, чи це початок, середина чи кінець події, і діяти відповідно. тобто ви можете викинути всі події після початку або лише дивитися на рух, як вам потрібно. З довідки про клас :

Жести довгого натискання безперервні. Жест починається (UIGestureRecognizerStateBegan), коли кількість допустимих пальців (числоOfTouchesRequired) було натиснуто протягом визначеного періоду (мінімальнийPressDuration) і дотики не виходять за рамки допустимого діапазону руху (допустимийMovement). Розпізнавач жестів переходить у стан Зміни кожного разу, коли палець рухається, і він закінчується (UIGestureRecognizerStateEnded), коли будь-який з пальців піднімається.

Тепер ви можете відстежувати стан так

-  (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
Наступна відповідь внизу показує, як це зробити, але я дав цю відповідь +1 через детальне пояснення та посилання на документацію.
Метт Конноллі

2
Може бути кориснішим прикладом коду, а не посиланням лише на документацію. Я розмістив свій фрагмент коду нижче. перевірити стан UIGestureRecognizerStateBegan.
Пол Солт

UIGestureRecognizerStateChanged
Rajneesh071

@joelm ти мене врятував)
Євгеній Клебан

Для Swift 4: якщо (sender.state == UITapGestureRecognizer.State.ended) {// Робіть все, що вам потрібно під час друку в кінці жесту ("\ n * longpress * \ n")}
Раві

117

Щоб перевірити стан UILongPressGestureRecognizer, просто додайте оператор if у методі вибору:

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

13
Ви не хочете цього блоку if / else, оскільки існує більше станів, ніж закінчено. "Довге натискання виявлено" друкується кілька разів, коли стан змінюється. Перевірте натомість стан UIGestureRecognizerStateBegan.
Пол Солт

2
Хтось дійсно повинен відредагувати цю відповідь, щоб відповідати тому, що йде в коментарі. На сьогоднішній день наданий код не працює.
Деклан МакКенна

75

Вам потрібно перевірити правильний стан, оскільки для кожної держави є різні поведінки. Швидше за все, вам знадобиться UIGestureRecognizerStateBeganдержава з 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
Схоже, вам потрібно рухати пальцями, щоб змусити стан змінитись; це правильно?
Аркадян

Це може запустити StateChanged при переміщенні пальців, це звучить аналогічно тому, що я робив у своєму тестовому коді.
Пол Солт

UIGestureRecognizerStateBegan, здається, викликається лише один раз, що ідеально підходить для моєї ситуації, намагаючись показати діалог про виявлення тривалого натискання кнопки. Інші стани дзвонять кілька разів. Дякую!
Даміан

19

Просто спробуйте:

Ціль-С

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

Швидкий 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:

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

ваш обробник жестів отримує дзвінок за кожний стан жесту. тож потрібно поставити чек для кожного стану та поставити свій код у потрібний стан.

Слід віддати перевагу використанню корпусу перемикача над іншим:

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;
         }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.