1

팬을 스 와이프하거나 스 와이프 할 때 팬 제스처를 사용하지 않으려하지만 팬 또는 스 와이프 여부에 관계없이 모두 활성화됩니다. 내가 잘못한 점이 있습니까?iOS 스 와이프시 팬 사용 안함

#pragma mark - UIGestureRecognizerDelegate methods 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { 
    [otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer]; 

    NSLog(@"added failure requirement to: %@", otherGestureRecognizer); 
} 

if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]]) { 
    [[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer]; 
} 

if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { 
    [left requireGestureRecognizerToFail:[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer]; 
    [right requireGestureRecognizerToFail:[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer]; 
} 

    return YES; 
} 
+0

안녕 shoujo_sm는,이 대답은 나에게 도움이 http://stackoverflow.com/questions/21928023/may-i-know-what-exactly-requiregesturerecognizertofail-will 문제를 어떻게 해결할 수 있을지 생각해보십시오. 결국에는 UIScrollView 속성을 사용했습니다. delaysContentTouches를 사용했습니다. 이 속성에 대한 설명서에서 다음과 같이 설명합니다. "이 속성의 값이 YES이면 스크롤보기가 의도인지 여부를 확인할 수있을 때까지 스크롤보기가 터치 다운 제스처 처리를 지연합니다. 값이 NO이면 스크롤보기가 즉시 호출됩니다 touchesShouldBegin : withEvent : inContentView : 기본값은 YES입니다. " – Lily

답변

3

이 두 제스처를 결합하기가 어렵습니다. 문제는 일반적으로 팬 제스처가 즉시 실행되기를 원하지만 사용자가 손가락을 어떤 경로로 드래그해야하기 때문에 스 와이프 제스처가 인식되는 데 약간의 시간이 걸리는 것입니다.

어쨌든 당신이 고려할 수 있습니다 일반적으로이 개 방법이 있습니다 : 먼저 (이미 한) 동시에 두 제스처 인식하고있다

. 추가 할 필요가있는 것은 스 와이프 제스처가 인식되면 팬 제스처 호출을 제거하기 만하면됩니다. 이렇게하려면 panGesture.enabled = NO; panGesture.enabled = YES; 두 줄을 하나씩 호출하고 다른 터치가 시작될 때까지 제스처가 트리거되지 않습니다.

두 번째로 스 와이프가 인식되는지 기다리고 있습니다. 그렇게하기 위해서는 팬 제스처를 길게 누르는 제스처로 바꾸는 것이 가장 쉽습니다. 길게 누르는 제스처는 팬의 제스처와 정확히 동일하게 작동한다는 점을 제외하고는 minimumPressDuration (슬쩍을 인식 할 것으로 예상되는 시간)과 적절한 경우 allowableMovement으로 설정해야합니다.

+0

안녕하세요, 귀하의 도움말 주셔서 감사합니다. 나는 "뉴욕 타임스"와 같은 일을하는 것을 목표로하고있다. 나는 SWRevealViewController를 사용하고 있기 때문에 긴 press로 변경하는 것이 나에게 다소 어려울 수도있다. –

+0

어떻게 그렇게됩니까? 당신이 매우 낮은 minimumPressDuration을 설정하면 팬 제스처를 길게 누르는 것은 팬 제스처와 동일하게 작동합니다. 이것으로 다른 코드를 변경해서는 안됩니다. 어쨌든 귀하의 질문을 다시 보면 약간의 모순이있는 것 같습니다. 팬 제스처가 스 와이프 제스처의 일부로 트리거되기 때문에 팬이 불가능할 때 스 와이프를 비활성화합니다. 가능한 경우 touch 메서드를 사용하여 사용자 정의 제스처 컨트롤을 구현하는 것을 고려할 수 있습니다. 그것은 쉬운 일이 아닙니다. –

+0

길게 누르는 경우 사용자가 스 와이프 한 방향을 감지 할 수 없습니다. 어떤 조건에서 팬 제스처에 YES/NO를 설정해야합니까? –

0

나는 동일한 문제가있었습니다.

나는 UIGestureRecognizerDelegate를 많이 사용했지만 운이 없었습니다.

나는 "팬"을 속도와 제스처 마무리에 따라 "스 와이프"로 간주해야 할 때 결정했습니다. 따라서 사용자가 패닝을 시작하고 속도가 특정 값보다 작 으면 사용자가 빠르게 팬하고 제스처를 끝내면 "스 와이프"가 트리거됩니다.

이것은 내 비즈니스 요구 사항에 맞춰 작성되었습니다. 희망이 도움이됩니다.

0

가능하게하는 제스처과의 관계를 만듭니다

panGesture.require(toFail: swipeGesture) 
관련 문제