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 секунд. Почему это? Как я могу исправить?
Ответы
Ответ 1
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
}
}
Ответ 2
Чтобы проверить состояние UILongPressGestureRecognizer, просто добавьте оператор if в метод выбора:
- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
} else if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
}
}
Ответ 3
Вам нужно проверить правильное состояние, так как для каждого состояния есть разные типы поведения. Скорее всего, вам понадобится состояние 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
}
}
Ответ 4
Просто попробуйте следующее:
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.");
}
}
Ответ 5
Вот как справиться с этим в Swift:
func longPress(sender:UILongPressGestureRecognizer!) {
if (sender.state == UIGestureRecognizerState.Ended) {
println("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
println("Long press detected.");
}
}
Ответ 6
Swift 3.0:
func handleLongPress(sender: UILongPressGestureRecognizer) {
if sender.state == .ended {
print("Long press Ended")
} else if sender.state == .began {
print("Long press detected")
}
Ответ 7
ваш обработчик жестов получает вызов для каждого состояния жестов. поэтому вам нужно поставить чек для каждого состояния и поместить свой код в требуемое состояние.
Нужно предпочесть использовать 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;
}
}