在滚动时通过UIScrollView的子视图处理点击事件

Llo*_*d18 8 cocoa-touch objective-c uiscrollview uigesturerecognizer ios

我有自定义UIScrollView子类,里面有一些内容视图.在其中一些我有UITapGestureRecogniser.滚动视图不滚动时,一切正常.但是当它滚动内容视图时,不会收到点按动作.当滚动视图滚动时,通过子视图处理点击操作的最简单的解决方案是什么?

细节:

MyScrollView水平滚动.它包含许多内容视图(例如MyContentView).每个MyContentView宽度约为MyScrollView宽度的三分之一.因此,目前大约有3-4个可见MyContentView元素.主要的行为MyScrollView是1)确保在滚动之后,其中一个MyContentView元素将位于屏幕的中心,2)滚动到中心,MyContentView如果用户点击它.因此,主要答案,我希望得到的是如何"正确"贯彻在自来水行动处理MyContentViewMyScrollView减速.

我发现了一些相同的问题和答案,但没有一个让我满意.最好的是实现gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:UITapGestureRecogniser委托.但在这种情况下,我有时候(当我点击时,制作smaaaal拖动和释放手指,因此水龙头是钢可识别的(让我们称之为准水龙头))同时具有点击和滚动事件,即使滚动视图不滚动也会导致错误当我开始点击.当用户进行准点击时,我的应用程序尝试滚动到tapped MyContentView元素,然后立即处理正常滚动.由于在处理tap之后开始执行一些其他功能(它在正常滚动时不能执行),这似乎更加可怕.

我需要解决方案,其中滚动视图等待足以决定它不是点击事件,然后才滚动.否则,如果已识别出tap事件,则不得发生滚动.

Mru*_*nal 5

您也可以使用@protocol来使用自定义委托方法.在添加了UIScrollView的视图控制器中实现这些委托方法.

MyContentView中:

在touchesBegan方法中,

[self.delegate contentViewTapped:self];
Run Code Online (Sandbox Code Playgroud)

现在在添加了滚动视图的ContainerView类中,实现该方法:

 - (void)contentViewTapped:(MyContentView *)myContentView {

NSLog (@"ContentView no: %d", myContentView.tag); // if tag has been set while adding this view to scrollview.
}
Run Code Online (Sandbox Code Playgroud)

浏览@protocol的示例.

希望这是你所需要的.

享受编码:)


Ash*_*row 4

这是内置的UIScrollView- 看看delaysContentTouchescanCancelContentTouches属性。这应该可以缓解点击后拖动一小段时的问题。

\n\n

这是所有系统内置行为。我建议坚持使用 Apple 提供的界面感觉(例如,它对小拖动的反应方式),这样您的应用程序在用户的手机上就不会感觉格格不入。

\n\n

编辑:

\n\n

或者,您可以在手势识别器中禁用滚动视图的滚动,并在结束/取消后重新启用它。

\n\n

进一步编辑: \n我不明白 - 我创建了一个示例\xc2\xa0项目,该项目说明如何使用手势识别器委托方法拦截滚动视图的子视图中的触摸。密切注意滚动视图的“可取消内容触摸”和“延迟内容触摸”属性。它们都是出于YES非常重要的原因。

\n\n

您的滚动视图应该延迟内容触摸,直到确定用户是否正在尝试点击、伪点击(如您所说)或平移滚动视图。Apple 已经编写了您要构建的功能;UIScrollView已经会做你想做的事了。

\n\n

问题是系统不希望滚动视图的子视图在滚动视图滚动时拦截点击事件。为此,如果确定用户实际上正在尝试平移,它将取消触摸事件。设置“延迟内容接触”可以启用此行为。确保它已打开并且应该没问题。

\n