아래로 누를 때 UILongPressGestureRecognizer가 두 번 호출됩니다.


359

사용자가 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"가 두 번 인쇄됩니다. 왜 이런거야? 어떻게 고칠 수 있습니까?

답변:


684

UILongPressGestureRecognizer는 지속적인 이벤트 인식기입니다. 이벤트의 시작, 중간 또는 종료인지 확인하려면 상태를보고 그에 따라 조치를 취해야합니다. 즉, 시작 후 모든 이벤트를 버릴 수 있으며 필요에 따라 움직임 만 볼 수 있습니다. 로부터 클래스 참조 :

길게 누르는 제스처는 연속적입니다. 허용 된 손가락 수 (numberOfTouchesRequired)가 지정된 기간 (minimumPressDuration) 동안 눌려지고 터치가 허용 가능한 이동 범위 (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
     }
  }

4
다음 답변은 그 방법을 보여 주지만 자세한 설명과 문서 링크로 인해이 답변에 +1을주었습니다.
매트 코놀리

2
문서에 연결하는 대신 코드 예제에서 더 도움이 될 수 있습니다. 아래에 코드 스 니펫을 게시했습니다. UIGestureRecognizerStateBegan 상태를 확인하십시오.
Paul Solt

UIGestureRecognizerStateChanged
Rajneesh071

당신이 나) 저장 @joelm
에브 게니 Kleban

스위프트 4의 경우 : if (sender.state == UITapGestureRecognizer.State.ended) {// 제스처 끝에서 원하는 것을 수행 print ( "\ n * longpressed * \ n")}
Ravi

117

UILongPressGestureRecognizer의 상태를 확인하려면 선택기 메소드에 if 문을 추가하십시오.

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

13
종료보다 많은 상태가 있기 때문에 if / else 블록을 원하지 않습니다. 상태가 변경되면 "긴 프레스 감지"가 여러 번 인쇄됩니다. 대신 UIGestureRecognizerStateBegan 상태를 확인하십시오.
Paul Solt

2
누군가가 그 해답을 맨 위 의견의 내용에 맞게 편집해야합니다. 제공된 코드는 작동하지 않습니다.
Declan McKenna

75

각 상태마다 다른 동작이 있으므로 올바른 상태를 확인해야합니다. 의 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
    }
}

2
상태를 변경하려면 손가락을 움직여야 할 것 같습니다. 그 맞습니까?
아카디아

손가락을 움직일 때 StateChanged가 트리거 될 수 있으며 테스트 코드에서 수행 한 것과 비슷합니다.
Paul Solt

UIGestureRecognizerStateBegan은 한 번만 호출 된 것으로 보이므로 버튼을 길게 누르는 것을 감지하는 대화 상자를 표시하려는 상황에 적합합니다. 다른 상태는 여러 번 호출됩니다. 감사!
Damian

19

이것을 시도하십시오 :

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

14

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

스위프트 3.0 :

func handleLongPress(sender: UILongPressGestureRecognizer) {

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

6

제스처 처리기는 각 제스처 상태에 대한 전화를받습니다. 따라서 각 상태를 확인하고 필요한 상태로 코드를 넣어야합니다.

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;
         }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.