문제

수평 패닝은 스크롤 뷰의 그림을 스크롤하지만 수직 패닝은 다른 작업을 수행하는 UIScrollView를 구현하려고 합니다.지금은 그림을 스크롤하는 데는 잘 작동하는 세로 스크롤이 비활성화된 상태로 페이지가 매겨진 UIScrollView가 있습니다. 하지만 세로 팬을 가로채서 그냥 먹히는 세로 팬 대신 내 메서드를 호출하는 방법을 찾으려고 미쳐가고 있습니다. 스크롤뷰.나는 할 수 있었다

    UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];

그러면 HandlePanGesture에서 패닝을 완벽하게 제어할 수 있습니다.그러나 이것은 내가 피하려고 하는 모든 스크롤 논리를 본질적으로 다시 작성하게 될 것 같은 느낌이 들기 때문에 특별히 도움이 되지 않습니다.이를 달성하는 방법에 대한 도움이나 지침을 주시면 대단히 감사하겠습니다.

감사해요!

도움이 되었습니까?

해결책

스크롤보기의 제스처의 사용으로 인해 팬 제스처를 사용하고 싶다면 어려울 것으로 생각합니다.그러나 스 와이프를 사용할 수 있으면 구현하기 쉽습니다.

    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
    swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
    [self.scrollView addGestureRecognizer:swipe];
.

이 This를 테스트했으며 핸들러를 호출하는 것이 좋습니다. 스크롤보기의 팬 제스처 인식기를 비활성화 할 필요가 없습니다 (테스트에서 스크롤보기가 충분히 높고 콘텐츠가 충분히 짧았습니다.수직 스크롤 - 이것이 필요하거나 아닌지는 모르겠습니다.)

다른 팁

iOS 5부터, UIScrollView 그 모습을 드러낸다 UIPanGestureRecognizer.맞춤 스와이프 설정 delegate 에게 self GestureRecognizer를 속성이나 ivar로 만들고 클래스가 <UIGestureRecognizerDelegate> 규약.그런 다음 구현 UIGestureRecognizerDelegate'에스 – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 이렇게:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer])
    {
         return NO;
    }
    return YES; // the default for this method
}

i UIPanGestureRecognizer를 추가 한 다음 이와 같이 setupgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:를 추가했습니다.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){
        return YES;
    }
    return NO;
}
.

gestureRecognizerShouldBegin:

체크를 추가했습니다.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view];
            CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x);
            CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y);
            if (distX > distY) {
                return NO;
            }
        } else {
            return NO;
        }
    }
    return YES;
}
.

위 또는 아래로 패닝 될 때 self.panGesture 만 사용하십시오.

업데이트

https://stackoverflow.com/a/8603839/667834 gestureRecognizerShouldBegin에 대한 더 나은 방법이있는 것으로 나타납니다.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint translation = [self.panGesture velocityInView:self.collectionView];
            return fabs(translation.y) > fabs(translation.x);
        } else {
            return NO;
        }
    }
    return YES;
}
.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top