44

我有一个垂直滚动的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);
}
4

3 回答 3

53

好的,我想通了。我需要做两件事来完成这项工作:

1)将我自己的平移识别器附加到滚动视图本身,而不是附加到它上面的另一个视图。

2)这种UIGestureRecognizerDelegate方法可以防止同时调用默认滚动视图和我自己的滚动视图时发生的愚蠢行为。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
于 2012-12-06T03:46:28.977 回答
17

我有同样的问题要解决,我这样做了:

1)将我自己的平移识别器附加到滚动视图。

2) 返回 YES on: –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

这将允许两种手势都起作用。所以这意味着在垂直滚动时,您的 panGesture 委托和 scrollView 委托都将被触发。如果是水平滚动,它只会调用您的 panGesture 委托。

3)在我的panGesture委托中,检测它是否是水平滚动,如果不是,忽略。

于 2013-10-12T21:12:41.227 回答
8

快速回答:

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
    }
}
于 2018-03-08T00:21:34.727 回答