垂直スクロール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);
}
わかった、わかった。この作業を行うには、2つのことを行う必要がありました。
1)スクロールビュー自体の上に自分のパンレコグナイザーをアタッチします。スクロールビューの上にある別のビューにはアタッチしません。
2)このUIGestureRecognizerDelegate
メソッドは、デフォルトのスクロールビューと自分のスクロールビューの両方が同時に呼び出されたときに起こる間抜けな動作を防ぎます。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
私は同じ問題を解決する必要があり、これを行いました:
1)自分のパン認識ツールをスクロールビューに添付します。
2)次の場合にYESを返します。– GestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
これにより、両方のジェスチャーが機能します。つまり、垂直スクロールでは、panGestureデリゲートとscrollViewデリゲートの両方が起動されます。水平スクロールの場合、panGestureデリゲートのみを呼び出します。
3)私のpanGestureデリゲートで、水平スクロールかどうかを検出し、そうでない場合は無視します。
迅速な回答:
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
}
}