使用UIPanGestureRecognizer复制UIScrollView取消行为

时间:2017-01-03 03:31:09

标签: ios uiscrollview uigesturerecognizer

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

UIScrollView可以很好地处理触摸和滑动的取消。如果用户开始足够快地滑动,则总是轻扫。如果用户触摸足够长时间以激活突出显示的状态,则滚动视图不会尝试滑动。

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

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

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

这似乎与UIScrollView通过触摸视图的方式重复,但它并没有复制UIScrollView的平移手势识别器被取消的方式。无论用户滑动的速度有多慢,或者UIControl的状态如何,都会始终触发self.refreshGesture

我已尝试在我的手势上设置代表,这可能是要走的路。但我还没有发现一种有效的组合。例如,仅检查触摸是否在UIControl内开始取消太频繁。我也尝试在我的控件中覆盖gestureRecognizerShouldBegin,但这看起来像是一个黑客,并且具有深远的影响(例如,干扰了UITextView的手势)。

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

enter image description here

1 个答案:

答案 0 :(得分:0)

我无法完全复制此内容,但WWDC 2014 #235建议了两种可能性。

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