首页 文章

按下时,UILongPressGestureRecognizer会被调用两次

提问于
浏览
329

我正在检测用户是否已按下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”被打印两次 . 为什么是这样?我该怎么办?

7 回答

  • 18

    您需要检查正确的状态,因为每个州都有不同的行为 . 很可能你需要使用 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
        }
    }
    
  • 113

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

    长按手势是连续的 . 当指定时间段(minimumPressDuration)按下允许的手指数(numberOfTouchesRequired)并且触摸不超出允许的移动范围(allowableMovement)时,手势开始(UIGestureRecognizerStateBegan) . 每当手指移动时,手势识别器转换到改变状态,并且当任何手指被抬起时,手势识别器结束(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
         }
      }
    
  • 5

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

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

    试试这个:

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

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

    func longPress(sender:UILongPressGestureRecognizer!) {
    
            if (sender.state == UIGestureRecognizerState.Ended) {
                println("Long press Ended");
            } else if (sender.state == UIGestureRecognizerState.Began) {
                println("Long press detected.");
            }
    }
    
  • 12

    Swift 3.0:

    func handleLongPress(sender: UILongPressGestureRecognizer) {
    
        if sender.state == .ended {
            print("Long press Ended")
        } else if sender.state == .began {
            print("Long press detected")
        }
    
  • 69

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

    人们必须更喜欢在if-else上使用switch-case:

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

相关问题