4

스 와이프 제스처 인식기와 팬 제스처 인식기를 동일한보기에 추가했습니다. 이러한 제스처는 서로 배타적이어야합니다. 심지어 중 -동일한보기에 UIPanGestureRecognizer 및 UISwipeGestureRecognizer를 추가하면 requireGestureToFail을 설정 한 후에 충돌이 발생합니다.

문제는 팬 제스처가 항상 호출된다는 점이다 (팬 제스처가 우선 순위를 받아야하기 때문에)

는이를 위해 나는 슬쩍 제스처

[swipeGesture requireGestureToFail:panGesture]; 

에 제약 조건을 추가 매우 빠른 스 와이프.

이 문제를 극복하기 위해 나는 팬 제스처의 대표자로 자신을 설정했습니다. 델리게이트 메서드에서 다음과 같이 몇 가지 코드를 설정했습니다.

좋은 동작을 보장 할 수있는 속도가 있습니까? 냄새 제스처가 실패하도록 또 다른 방법이 있습니까? 모두 UIPanGestureRecognizerUISwipeGestureRecognizer이 같은 전망에 작동하도록하는 방법 (두 제스처 인식 자에 대한 특정 주문을 선언 아래) 애플의 문서 here에 따르면

+1

는'시도 했습니까? – Akhilrajtr

+0

나는 동시에 그것을 원하지 않는다 - 나는 왜 질문에 "독점적 인"것을 썼다. –

답변

10

UIPanGestureRecognizer (반대를 호출하기 전에 실패 할 UISwipeGesureRecognizer을 요구하는 것입니다 당신이 쓴 것의). 이것은 아마도 스 와이프 제스처가 팬 제스처라는 사실과 관련이 있지만 그 반대가 반드시 사실 일 수는 없습니다 (SO 질문 참조).

나는 코드의이 작은 조각을 썼다는 모두 팬 슬쩍 제스처 인식 관리 :뿐만 아니라 당신이 실패 할 슬쩍 제스처를 필요로하기 때문에 당신이 (희망 원하는만큼

UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panned:)]; 
UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped:)]; 
[pan requireGestureRecognizerToFail:swipe]; 
swipe.direction = (UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight); 

-(void)panned:(UIPanGestureRecognizer *)gesture 
{ 
    NSLog(@"Pan"); 
} 

-(void)swiped:(UISwipeGestureRecognizer *)gesture 
{ 
    NSLog(@"Swipe"); 
} 

이 작동하지 않습니다 팬 제스처가 시작되기 전에 약간의 지연이 있음) 작동하지만 작동합니다. 그러나 게시 한 코드를 통해 몸짓을 원하는대로 미세 조정할 수 있습니다.

1

응답이 늦었지만 스 와이프 전에 팬이 인식되도록하려는 것과 비슷한 문제가있었습니다. 내가 작동하도록 할 수있는 유일한 방법은 길게 누르거나 비슷한 것을 사용하여 팬 제스처를 팬이나 슬쩍으로 사용하는 플래그를 설정하는 것이 었습니다. 나는 스 와이프를 전혀 사용하지 않았다. 즉 : 그래서 본질적으로

- (void) handleLongPress : (UILongPressGestureRecognizer *) gestureRecognizer 
{ 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
     _canSwipe = YES; 
    } 
    else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) 
    { 
     _canSwipe = NO; 
    } 
} 

- (void) handleDragging : (id) sender 
{ 
    UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)sender; 
    GLKVector2 dragDelta = GLKVector2Make(0., 0.); 

    if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged) 
    { 
     _mousePosition = [pan translationInView:self.view]; 
     if (_beginDragging == NO) 
     { 
      _beginDragging = YES; 
     } 
     else 
     { 
      dragDelta = GLKVector2Make(_mousePosition.x - _prevMousePosition.x, _mousePosition.y - _prevMousePosition.y); 
     } 

     _prevMousePosition = _mousePosition; 
    } 
    else 
    { 
     _beginDragging = NO; 
    } 

    if (_canSwipe == YES) 
    { 
     if (dragDelta.x > 0) 
     { 
      _canSwipe = NO; 
      [self.navigationController popToRootViewControllerAnimated:YES]; 
      NSLog(@"swipe right"); 
     } 
     else if (dragDelta.x < 0) 
     { 
      _canSwipe = NO; 
      [self performSegueWithIdentifier:@"toTableSegue" sender:pan]; 
      NSLog(@"swipe left"); 
     } 
    } 
    else 
    { 
     _dragDeltaTranslation = GLKVector2Make(dragDelta.x/90, dragDelta.y/90); 
     _translationXY = GLKVector2Make(_translationXY.x + _dragDeltaTranslation.x, _translationXY.y - _dragDeltaTranslation.y); 
    } 
} 

: 최대한 빨리 출시로, 상태가 UIGestureRecognizerStateEnded로 이동하기 때문에

  1. 사용 길게 누르면 (또는 다른 메커니즘) (길게 누름이 좋은 강타의 상태를 활성화)
  2. 그런 다음 팬 방향을 사용하여 스 와이프 방향을 결정하십시오. `(UIGestureRecognizer *) YES 반환`otherGestureRecognizer` 방법 : (UIGestureRecognizer *) gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer : (BOOL) gestureRecognizer - 2.
관련 문제