質問

ScrollViewの写真を介して水平方向にスクロールするUISCrollViewを実装しようとしていますが、垂直パンは私が持っている別の行動を実行します。今、私は写真を介してスクロールするのに問題ない垂直スクロールの無効化とともにページを出しているUIScrollViewがありますが、垂直パンを傍受し、垂直パンの代わりに私自身のメソッドを呼び出す方法を見つけようとしているだけで狂ってください。スクロールビュー私は

をすることができました
    UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];
.

私は私のハンドルパンジュールのパンの全体的な管理を与えます:方法ですが、これは私が本質的に避けようとしているすべてのスクロール論理を書き換えるような気がします。これを達成する方法についての助けやガイダンスは大いに感謝されます。

ありがとう!

役に立ちましたか?

解決

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

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

これをテストし、ハンドラを呼び出すことができず、スクロールビューのPANジェスチャー認識を無効にする必要はありません(私のテストでは、スクロールビューは十分に高く、コンテンツは十分に短かったのは十分に短かったのに十分短かった)。垂直スクロール - これが必要かどうかわからない)。

他のヒント

現在のiOS 5、UIScrollView UIPanGestureRecognizer を公開します。カスタムスワイプのdelegateselfに設定し、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
}
.

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のためのより良いメソッドを持つように見えます。P>

- (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