【问题标题】:Intercepting pan gestures over a UIScrollView breaks scrolling在 UIScrollView 上拦截平移手势会中断滚动
【发布时间】:2012-11-24 01:20:43
【问题描述】:

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

【问题讨论】:

  • 你试过[panGesture setCancelsTouchesInView:NO];吗?只需在 shouldRecognizeSimultaneouslyWithGestureRecognizer 中返回 YES 即可帮助您找出问题所在。
  • 刚试了一下,没什么区别。

标签: ios ios5 uiscrollview uigesturerecognizer uipangesturerecognizer


【解决方案1】:

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

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

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

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

【讨论】:

  • shouldRecognizeSimultaneouslyWithGestureRecognizer 的默认行为是返回 NO,因此不需要添加
  • 将返回值改为YES,效果很好。
【解决方案2】:

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

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

2) 返回 YES: –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

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

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

【讨论】:

  • 这与我在自己的答案中推荐的完全一样。
  • @BlackRider 不是。这返回 YES
  • 感谢gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer 成功了。
【解决方案3】:

快速回答:

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

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 2012-09-23
    • 2016-09-07
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多