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) было нажато в течение указанного периода (минимальная длительность) и касания не выходят за пределы допустимого диапазона движения (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
}
}
Просто попробуйте это:
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 3.0:
func handleLongPress(sender: UILongPressGestureRecognizer) {
if sender.state == .ended {
print("Long press Ended")
} else if sender.state == .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.");
}
}
Ваш обработчик жестов получает вызов для каждого состояния жеста. поэтому вам нужно поставить проверку для каждого состояния и перевести ваш код в требуемое состояние.
Надо предпочесть использование 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;
}
}