UILongPressGestureRecognizer вызывается дважды при нажатии

Я обнаруживаю, что пользователь нажал в течение 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");
}

Текст "double oo" печатается дважды, когда я нажимаю более 2 секунд. Почему это? Как я могу исправить?

302
задан Sheehan Alam 23 июля '10 в 18:21
источник поделиться
7 ответов

UILongPressGestureRecognizer - это непрерывный распознаватель событий. Вы должны посмотреть на состояние, чтобы увидеть, является ли это началом, серединой или концом события и действовать соответствующим образом. т.е. вы можете выбросить все события после начала или только взглянуть на движение по мере необходимости. Из Ссылка на класс:

Жесты непрерывной печати непрерывны. Жест начинается (UIGestureRecognizerStateBegan), когда число допустимых пальцев (numberOfTouchesRequired) было нажато в течение заданного периода (minimumPressDuration), и штрихи не выходят за допустимый диапазон движения (допустимое перемещение). Устройство распознавания жестов переходит в состояние изменения всякий раз, когда движется палец, и заканчивается (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
     }
  }
592
ответ дан joelm 23 июля '10 в 19:41
источник поделиться

Чтобы проверить состояние UILongPressGestureRecognizer, просто добавьте оператор if в метод выбора:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {    
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}
111
ответ дан Dan 11 нояб. '10 в 18:43
источник поделиться

Вам нужно проверить правильное состояние, так как для каждого состояния есть разные типы поведения. Скорее всего, вам понадобится состояние 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
    }
}
66
ответ дан Paul Solt 18 авг. '11 в 23:55
источник поделиться

Просто попробуйте следующее:

Objective-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.");
        }
}
15
ответ дан svmrajesh 07 сент. '15 в 11:38
источник поделиться

Вот как справиться с этим в Swift:

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}
11
ответ дан Raj 25 сент. '14 в 0:29
источник поделиться

Swift 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

if sender.state == .ended {
    print("Long press Ended")
} else if sender.state == .began {
    print("Long press detected")
}
8
ответ дан fozoglu 26 нояб. '16 в 15:49
источник поделиться

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

Нужно предпочесть использовать switch-case over if-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 04 апр. '14 в 12:21
источник поделиться