UILongPressGestureRecognizer được gọi hai lần khi nhấn xuống


359

Tôi đang phát hiện nếu người dùng đã nhấn xuống trong 2 giây:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
        longPress.minimumPressDuration = 2.0;
        [self addGestureRecognizer:longPress];
        [longPress release];

Đây là cách tôi xử lý báo chí dài:

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
    NSLog(@"double oo");
}

Văn bản "double oo" được in hai lần khi tôi nhấn xuống lâu hơn 2 giây. Tại sao lại thế này? Làm thế nào tôi có thể sửa chữa?

Câu trả lời:


684

UILongPressGestureRecognizer là một trình nhận dạng sự kiện liên tục. Bạn phải nhìn vào trạng thái để xem đây là sự khởi đầu, giữa hay kết thúc của sự kiện và hành động tương ứng. tức là bạn có thể vứt bỏ tất cả các sự kiện sau khi bắt đầu, hoặc chỉ nhìn vào chuyển động khi bạn cần. Từ tài liệu tham khảo lớp :

Cử chỉ nhấn dài là liên tục. Cử chỉ bắt đầu (UIGestureRecognizerStateBegan) khi số lượng ngón tay cho phép (numberOfTouchesRequired) đã được nhấn trong khoảng thời gian được chỉ định (minimPressDuration) và các lần chạm không vượt quá phạm vi di chuyển cho phép (cho phép di chuyển). Trình nhận dạng cử chỉ chuyển sang trạng thái Thay đổi mỗi khi ngón tay di chuyển và nó kết thúc (UIGestureRecognizerStateEnded) khi bất kỳ ngón tay nào được nhấc lên.

Bây giờ bạn có thể theo dõi trạng thái như thế này

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

4
Câu trả lời tiếp theo cho thấy cách thực hiện, nhưng tôi đã cho câu trả lời này là +1 vì giải thích chi tiết và liên kết đến tài liệu.
Matt Connolly

2
Có thể hữu ích hơn với một ví dụ mã, thay vì chỉ liên kết đến tài liệu. Tôi đã đăng đoạn mã của tôi dưới đây. kiểm tra trạng thái UIGestureRecognizerStateBegan.
Paul Solt

UIGestureRecognizerStateChanged
Rajneesh071

@joelm bạn đã cứu tôi)
Evgeniy Kleban

Đối với Swift 4: if (sender.state == UITapGestureRecognizer.State.ends) {// Làm bất cứ điều gì bạn muốn trên bản in End of Gesture ("\ n * longpressed * \ n")}
Ravi

117

Để kiểm tra trạng thái của UILongPressGestureRecognizer, chỉ cần thêm một câu lệnh if trên phương thức chọn:

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

13
Bạn không muốn khối if / khác, vì có nhiều trạng thái hơn Kết thúc. "Phát hiện nhấn lâu" sẽ in nhiều lần khi trạng thái thay đổi. Thay vào đó, hãy kiểm tra trạng thái UIGestureRecognizerStateBegan.
Paul Solt

2
Ai đó nên thực sự chỉnh sửa câu trả lời đó để phù hợp với những gì bình luận hàng đầu nói. Vì nó đứng mã được cung cấp không hoạt động.
Declan McKenna

75

Bạn cần kiểm tra trạng thái chính xác, vì có những hành vi khác nhau cho mỗi trạng thái. Nhiều khả năng bạn sẽ cần UIGestureRecognizerStateBegannhà nước với 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
    }
}

2
Có vẻ như bạn phải di chuyển các ngón tay của mình để thay đổi trạng thái; đúng không?
Arcadian

Nó có thể kích hoạt StateChanged khi di chuyển ngón tay xung quanh, âm thanh đó giống với những gì tôi đang làm trong mã kiểm tra của mình.
Paul Solt

UIGestureRecognizerStateBegan dường như chỉ được gọi một lần, điều này hoàn hảo cho tình huống của tôi khi cố gắng hiển thị hộp thoại phát hiện nhấn lâu vào nút. Các tiểu bang khác được gọi nhiều lần. Cảm ơn!
Damian

19

Hãy thử điều này:

Mục tiêu-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.");
        }
}

14

Đây là cách xử lý trong Swift:

func longPress(sender:UILongPressGestureRecognizer!) {

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

13

Swift 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

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

6

xử lý cử chỉ của bạn nhận được cuộc gọi cho từng trạng thái của cử chỉ. vì vậy bạn cần đặt một kiểm tra cho từng trạng thái và đặt mã của bạn ở trạng thái cần thiết.

Người ta phải thích sử dụng trường hợp chuyển đổi hơn if-other:

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;
         }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.