如何让 UIScrollView 忽略单次触摸?

Posted

技术标签:

【中文标题】如何让 UIScrollView 忽略单次触摸?【英文标题】:How do I make an UIScrollView to ignore single touches? 【发布时间】:2012-06-13 07:40:19 【问题描述】:

我在另一个UIScrollView 中有一个UIScrollView。外部滚动视图处理分页,内部滚动视图处理缩放(它是一个支持缩放的图片库)。我需要内部滚动视图来忽略单次触摸,以便它们转到外部滚动视图。

这可以使用[innerScrollView setUserInteractionEnabled:NO] 来完成,但这显然也会关闭内部滚动视图上的捏合和平移手势。有没有办法让内部缩放视图处理捏合和平移手势并将所有其他事件转发到响应者链上?

PS。我总是可以带着一些代表团黑客来解决这个问题。我想知道是否有一种简单的方法可以使用常规响应者链使其正常工作。

【问题讨论】:

【参考方案1】:

我发现:单击事件最终会到达内部滚动视图内的内容视图上的touchesBegan:withEvent:。此内容视图未实现该方法,默认的UIView 实现将事件向上传递到响应者链。这里我们有内部滚动视图,确实实现了touchesBegan:withEvent:。这个实现吞下了单次点击,没有任何东西进入响应者链。有助于将UIScrollView 子类化并手动将修饰发送到响应者链:

- (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event

    [[self nextResponder] touchesBegan:touches withEvent:event];

当然,这样转发至少touchesEnded:withEvent:也不错。这可以满足我的一切需求。内部滚动视图可以处理缩放和平移,外部滚动视图接收单击事件。我什至可以放大然后平移到右侧,以便转到下一页。

【讨论】:

好问题和好答案。我正在使用它在UITableViewCell 中添加UIScrollView 以模仿“滑动操作”。我需要忽略滚动视图上的点击事件并将它们转发到单元格本身以保持 tableCell 选择与didSelectRowAtIndex 工作。【参考方案2】:

ios 5 上,UIScrollViews 公开它们的 panGestureRecognizerpinchGestureRecognizer

所以,如果您不需要支持较旧的 iOS 版本,您可以尝试innerScrollView.panGestureRecognizer.minimumNumberOfTouches = 2

编辑:这不起作用; scrollView 仍然吞下触摸。我将把它留在这里以供进一步参考。

如果您根本不希望内部 scrollView 处理平移,您可能(我没有尝试过)只需删除它的 panGestureRecognizer。

【讨论】:

我希望它能够处理平移,甚至用一根手指进行平移。我只是不希望它响应单点触摸事件,吞下它们。它确实如此,即使在提高平移手势识别器上的最小触摸次数之后也是如此。 单指平移不是单点触摸事件吗?恐怕我好像误会你了。顺便说一句,如果您确实提出了一个好的解决方案,我很想听听。我发现 ScrollView hack 非常吸引人。 @zoul 另外,从用户界面的角度来看,您希望如何处理水平平移和分页?平移到末尾,然后翻页? 对不起,我可能对术语太粗心了。我希望内部滚动视图忽略的是当用户点击屏幕并抬起手指而不移动它时(“点击”,而不是“拖动”)。我有一个可行的解决方案,我目前正在编辑我的答案。 我对忽略点击非常讲究,因为我想保持“内容”控制器和实现分页的控制器之间的松散耦合。对于手势识别器,内容控制器必须有一个额外的界面来报告更高的点击次数。 (这就是响应者链已经存在的原因。)感谢您的讨论!

以上是关于如何让 UIScrollView 忽略单次触摸?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 UIView 忽略触摸而不释放它?

使用平移手势,单次触摸后忽略触摸?

如何阻止 UIScrollView 吞下触摸

UIScrollView 内的 UIView 没有收到触摸事件

从 UIScrollview 向前触摸和手势到视图

以编程方式将触摸传递给 UIScrollView 以进行滚动