ChatGPT解决这个技术问题 Extra ChatGPT

按下时 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”会打印两次。为什么是这样?我该如何解决?


C
Crashalot

UILongPressGestureRecognizer 是一个连续事件识别器。您必须查看状态,看看这是事件的开始、中间还是结束,并采取相应的行动。即,您可以在开始后丢弃所有事件,或者仅根据需要查看运动。从 Class Reference

长按手势是连续的。当允许的手指数量 (numberOfTouchesRequired) 在指定的时间 (minimumPressDuration) 内被按下并且触摸没有超出允许的移动范围 (allowableMovement) 时,手势开始 (UIGestureRecognizerStateBegan)。每当手指移动时,手势识别器就会转换到 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
     }
  }

下一个答案显示了如何做到这一点,但我给了这个答案+1,因为它有详细的解释和文档链接。
使用代码示例可能会更有帮助,而不仅仅是链接到文档。我在下面发布了我的代码片段。检查 UIGestureRecognizerStateBegan 状态。
UIGestureRecognizerStateChanged
@joelm 你救了我)
对于 Swift 4: if (sender.state == UITapGestureRecognizer.State.ended ) { //在手势结束时做任何你想做的事情 print("\n * longpressed *\n") }
s
shim

要检查 UILongPressGestureRecognizer 的状态,只需在选择器方法上添加一个 if 语句:

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

你不想要那个 if/else 块,因为状态比 Ended 多。当状态改变时,“检测到长按”会打印多次。改为检查 UIGestureRecognizerStateBegan 状态。
有人应该真正编辑该答案以符合最高评论所说的内容。就目前而言,提供的代码不起作用。
P
Paul Solt

您需要检查正确的状态,因为每个状态都有不同的行为。您很可能需要带有 UILongPressGestureRecognizerUIGestureRecognizerStateBegan 状态。

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
    }
}

似乎您必须移动手指才能改变状态;那是对的吗?
它可能会在移动手指时触发 StateChanged,这听起来与我在测试代码中所做的类似。
UIGestureRecognizerStateBegan 似乎只被调用一次,这非常适合我试图在检测到长按按钮时显示对话框的情况。其他州被多次调用。谢谢!
o
odemolliens

试试这个:

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

P
Pang

斯威夫特 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

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

R
Raj

以下是在 Swift 中处理它的方法:

func longPress(sender:UILongPressGestureRecognizer!) {

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

R
RyanTCB

您的手势处理程序接收每个手势状态的调用。所以您需要检查每个状态并将您的代码置于所需状态。

必须更喜欢使用 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;
         }
}

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅