web-dev-qa-db-ja.com

UIScrollView上のパンジェスチャをインターセプトすると、スクロールが壊れます

垂直スクロールUIScrollViewがあります。デフォルトの垂直スクロール動作を許可しながら、水平パンも処理したいです。スクロールビューの上に透明なUIViewを配置し、それにパンジェスチャレコグナイザーを追加しました。この方法でパンをうまく取得できますが、スクロールビューはジェスチャーを受け取りません。

次のUIPanGestureRecognizerDelegateメソッドを実装しました。ジェスチャレコグナイザーを水平方向のパンのみに制限したいと思っていましたが、それは役に立ちませんでした。

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
    // Only accept horizontal pans here.
    // Leave the vertical pans for scrolling the content.
    CGPoint translation = [gestureRecognizer translationInView:self.view];
    BOOL isHorizontalPan = (fabsf(translation.x) > fabsf(translation.y));
    return  isHorizontalPan;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return (otherGestureRecognizer == _scrollView.panGestureRecognizer);
}
40
Macondo2Seattle

わかった、わかった。この作業を行うには、2つのことを行う必要がありました。

1)スクロールビュー自体の上に自分のパンレコグナイザーをアタッチします。スクロールビューの上にある別のビューにはアタッチしません。

2)このUIGestureRecognizerDelegateメソッドは、デフォルトのスクロールビューと自分のスクロールビューの両方が同時に呼び出されたときに起こる間抜けな動作を防ぎます。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
44
Macondo2Seattle

私は同じ問題を解決する必要があり、これを行いました:

1)自分のパン認識ツールをスクロールビューに添付します。

2)次の場合にYESを返します。– GestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

これにより、両方のジェスチャーが機能します。つまり、垂直スクロールでは、panGestureデリゲートとscrollViewデリゲートの両方が起動されます。水平スクロールの場合、panGestureデリゲートのみを呼び出します。

3)私のpanGestureデリゲートで、水平スクロールかどうかを検出し、そうでない場合は無視します。

14
tony.tc.leung

迅速な回答:

let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:)))
scrollViewPanGesture.delegate = self
scrollView.addGestureRecognizer(scrollViewPanGesture)

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
3
bnussey