8

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

细节:

MyScrollView水平滚动。它包含很多内容视图(例如MyContentView)。每个MyContentView具有大约三分之一宽度的MyScrollView宽度。因此,一次大约有 3-4 个可见MyContentView元素。的主要行为MyScrollView是 1)确保滚动后MyContentView元素之一将位于屏幕中心, 2)如果用户点击它,则滚动到中心MyContentView。所以我希望得到的主要答案是如何在减速MyContentView时“正确”实现对点击动作的处理。MyScrollView

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

我需要滚动视图等待足以确定它不是点击事件然后才进行滚动的解决方案。否则,如果点击事件已识别滚动,则不得发生。

4

2 回答 2

5

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

就像在MyContentView

在 touchesBegan 方法中,

[self.delegate contentViewTapped:self];

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

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

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

浏览@protocol的示例。

希望这是您所需要的。

享受编码:)

于 2012-07-24T15:42:45.773 回答
4

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

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

编辑:

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

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

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

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

于 2012-07-24T11:30:29.710 回答