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

当我按下超过2秒时,文本“double oo”会打印两次。为什么会这样?我该如何解决?

95139 次浏览

UILongPressGestureRecognizer是一个连续事件识别器。你必须观察状态,看看这是事件的开始、中间还是结束,并据此采取行动。也就是说,你可以在开始后抛弃所有事件,或者只看你需要的运动。从类引用:

长按手势是连续的。手势开始(UIGestureRecognizerStateBegan)时,允许的手指数量(numberOfTouchesRequired)已按下指定的时间(minimumPressDuration)和触摸不超出允许的移动范围(allowableMovement)。每当手指移动时,手势识别器就转换到Change状态,当任何手指抬起时,它就结束(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的状态,只需在selector方法上添加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
}
}

您的手势处理程序接收每个手势状态的调用。因此,您需要对每个状态进行检查,并将代码置于必需状态。

一个人肯定更喜欢使用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;
}
}

下面是如何在Swift中处理它:

func longPress(sender:UILongPressGestureRecognizer!) {


if (sender.state == UIGestureRecognizerState.Ended) {
println("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
println("Long press detected.");
}
}

试试这个:

objective - c

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

斯威夫特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.");
}
}

斯威夫特3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {


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