【问题标题】:Duplicate UIScrollView cancel behavior with UIPanGestureRecognizer使用 UIPanGestureRecognizer 重复 UIScrollView 取消行为
【发布时间】:2017-05-17 02:28:09
【问题描述】:

我的应用使用分页的水平滚动视图。每个页面都有用户可以点击的 UIControls。

UIScrollView 在处理取消触摸和滑动方面做得很好。如果用户开始滑动的速度足够快,则始终是滑动。如果用户按下足够长的时间来激活高亮状态,则滚动视图不会尝试滑动。

我正在尝试使用 UIPanGestureRecognizer 子类复制此行为,以便我可以响应滚动视图中的向下滑动。但是,如果 UIControls 突出显示,我无法取消手势。

到目前为止,我已经完成了以下工作:

self.refreshGesture.cancelsTouchesInView = YES;
self.refreshGesture.delaysTouchesBegan = NO;
self.refreshGesture.delaysTouchesEnded = NO;

这似乎复制了 UIScrollView 传递触摸 视图的方式,但它并没有复制 UIScrollView 的平移手势识别器被取消的方式。无论用户滑动多慢,或者 UIControls 的状态如何,self.refreshGesture 总是会被触发。

我已经尝试在我的手势上设置代理,这可能是要走的路。但我还没有找到有效的组合。例如,仅检查触摸是否在 UIControl 内启动会过于频繁地取消。我还尝试在我的控件中覆盖 gestureRecognizerShouldBegin,但这似乎是一种 hack,并且具有深远的影响(例如,干扰 UITextView 的手势)。

在这个 GIF 中,您可以看到控件在触摸时激活,如果发生这种情况,滚动视图会取消滚动。但我的向下平移手势并没有以同样的方式取消:

【问题讨论】:

    标签: ios uiscrollview uigesturerecognizer


    【解决方案1】:

    我无法准确复制这一点,但WWDC 2014 #235 提出了两种可能性。

    1. 在您的主要内容上添加一个透明的滚动视图,并将其手势识别器移动到您的根视图上。这就是做的。它让我可以使用UIScrollViewDelegate,这最终就足够了。
    2. 使用“超时”手势识别器。该视频建议要求超时手势失败,但在我的情况下,使用长按手势并在长按触发时取消我的平移效果更好。 0.1 秒似乎比他们建议的 0.15 秒效果更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多