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 секунд. Почему это? Как я могу исправить?

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

Жесты жесткой печати непрерывны. Жест начинается (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 } } 

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

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

Вам нужно проверить правильное состояние, так как для каждого состояния есть разные типы поведения. Скорее всего, вам понадобится состояние 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 } } 

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

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

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

 func longPress(sender:UILongPressGestureRecognizer!) { if (sender.state == UIGestureRecognizerState.Ended) { println("Long press Ended"); } else if (sender.state == UIGestureRecognizerState.Began) { println("Long press detected."); } } 

Swift 3.0:

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

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

Нужно предпочесть использовать 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; } } 
Interesting Posts

Лямбда-выражения как параметры шаблона classа

Удаление элемента из вектора при повторении?

Можно ли заменить обычный разъем на SSLSocket?

Рам не признан

Хранение документов в виде блоков в базе данных – любые недостатки?

Как проверить, пересекает ли отрезок линии выровненную по оси прямоугольник в 2D?

iPhone UIWebView локальных ресурсов с использованием Javascript и обработки onorientationChange

Командная строка администратора Windows 7 «Пуск в пути»

Хранить данные в MKAnnotation?

Как сжать загрузочный раздел Windows 7 с помощью неподвижных файлов

Почему я не получаю ошибку сегментации, когда пишу за пределами массива?

В чем разница между «system32 \ java.exe» и «Program Files \ Java \ jdk1.6.0_33 \ bin \ java.exe»?

Загрузите компоненты Android SDK для автономной установки

Могу ли я использовать свою Linux-ящику как сервер «System Imaging»? (То есть, Norton Ghost Server?)

Как контролировать объем мультимедиа?

Давайте будем гением компьютера.