9

水平方向にパンするとスクロールビューの画像がスクロールするUIScrollViewを実装しようとしていますが、垂直方向にパンすると別のアクションが実行されます。現在、垂直スクロールが無効になっているUIScrollViewがあり、画像をスクロールするのに問題なく機能しますが、垂直パンが食べ尽くされるのではなく、垂直パンをインターセプトして独自のメソッドを呼び出す方法を見つけようとしています。スクロールビュー。できました

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

これにより、handlePanGesture:メソッドのパンを完全に制御できますが、これは特に役に立ちません。回避しようとしているすべてのスクロールロジックを本質的に書き直そうとしているように感じるからです。これを達成する方法についてのヘルプやガイダンスをいただければ幸いです。

ありがとう!

4

3 に答える 3

10

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
}
于 2012-10-03T00:23:17.040 に答える
9

次のようなUIPanGestureRecognizerセットアップを追加しました。gestureRecognizer: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;
}
于 2013-11-13T05:21:24.677 に答える
4

スクロール ビューがパン ジェスチャを使用しているため、パン ジェスチャを使用する場合、これは難しいと思います。ただし、スワイプを使用できれば、実装は簡単です。

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

これをテストしたところ、ハンドラーを呼び出すのに問題なく動作し、スクロール ビューのパン ジェスチャ レコグナイザーを無効にする必要はありません (私のテストでは、スクロール ビューは十分に高く、コンテンツは十分に短いため、垂直スクロールはありませんでした。 -これが必要かどうかはわかりません)。

于 2012-10-02T23:59:08.733 に答える