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.