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 секунд. Почему это так? Как я могу исправить?
7 ответов:
UILongPressGestureRecognizer-это непрерывный распознаватель событий. Вы должны смотреть на состояние, чтобы увидеть, если это начало, середина или конец событий и действовать соответственно. т. е. вы можете выбросить все события после старта, или только смотреть на движение, как вам нужно. Из Ссылка На Класс:
жесты длительного нажатия являются непрерывными. Жест начинается (UIGestureRecognizerStateBegan), когда количество допустимых пальцев (numberOfTouchesRequired) имеют был нажат в течение указанного периода (minimumPressDuration) и прикосновения не выходят за пределы допустимого диапазона движения (allowableMovement). Распознаватель жестов переходит в состояние изменения всякий раз, когда палец перемещается, и он заканчивается (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 } }
просто попробуйте это:
С
- (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 над 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; } }