33

私は垂直スクロールUIScrollViewを持っています。また、デフォルトの垂直スクロール動作を許可しながら、水平パンを処理したい。スクロールビューに透明なUIViewを置き、パンジェスチャ認識機能を追加しました。この方法で、私はパンを手に入れることができますが、スクロールビューにはジェスチャーはありません。UIScrollViewを介したパンのジェスチャーを傍受するとスクロールが壊れます

私は唯一の水平パンに私のジェスチャー認識を制限することを望んで、次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); 
} 
+1

あなたは '[panGesture setCancelsTouchesInView:NO]を試してみましたか;'? 'shouldRecognizeSimultaneouslyWithGestureRecognizer'で単にYESを返すだけで、問題がどこにあるかを理解するのに役立ちます。 –

+0

ちょうどそれを試しました、違いはありません。 – Macondo2Seattle

答えて

33

[OK]を、私はそれを考え出しました。

1)自分のパンレコグナイザをスクロールビュー自体に添付します。その上に他のビューは表示されません。

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

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 
+2

shouldRecognizeSimultaneouslyWithGestureRecognizerのデフォルトの動作はNOを返すので、addは不要です –

+4

戻り値を 'YES'に変更すると素晴らしい結果が得られます。 –

11

私は解決するために同じ問題を抱えていたし、私はこれでした:スクロールビューに自分のパン認識を添付)

1。

2)に戻りYES: - gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

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

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

+1

これは、自分の答えでお勧めするのとまったく同じです。 – Macondo2Seattle

+11

@BlackRiderそうではありません。これはYESを返す –

+0

感謝 'gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer'がトリックをしました。 – atulkhatri

0

スウィフト答え:

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 
    } 
} 
関連する問題