UIScrollView如何从其子视图中窃取?

时间:2010-03-18 17:44:23

标签: iphone cocoa-touch uiscrollview

我希望能够在他们的子视图之前创建我自己的UIView容器子类,它可以首先对触摸作出反应。这很棘手,因为通常子视图会在超级视图之前接收触摸事件(通过touchesBegan:等)。 UIScrollView如何逆转这个?

要清楚,我询问UIScrollView 的行为。我理解它的作用,以及你通常如何使用它。我问的是如何干净地实现我自己的版本 - 不是因为我想,而是因为我正在尝试构建可重用的容器视图,以利用类似的行为。

3 个答案:

答案 0 :(得分:12)

您可以在hitTest:withEvent:子类中实现UIView方法。

调用此方法以检查哪个子视图必须接收触摸事件,因此您可以在实际发生之前执行某些操作。您还可以更改必须接收事件的子视图。

答案 1 :(得分:3)

[编辑: 好吧,我在某种程度上将这个问题视为与实际问题完全相反的问题。我会留下这个,以防有人好奇,但这与实际问题无关 - TechZen]

滚动视图水平和垂直移动,因此必须对所有触摸进行采样,以查看它们是否滚动触摸。

例如,滚动视图中有一个水平滚动的滑块。用户触摸滑块。触摸是滑动滑块还是水平滚动的开始?哪个优先?

即使以编程方式,响应者链从最底部的视图(最顶部的视觉)向上移动直到它找到处理它的对象,在幕后处理触摸的位置从最顶层视图(这是应用程序窗口)向下。大多数视图只是将此信息转发给子视图,然后激活然后向响应者链发送事件以进行处理。因为滚动整个视图是一个并不真正属于普通响应者链的特殊事件,所以滚动视图拦截触摸位置的向下传递,以确定它是否需要在将触摸位置传递到子视图之前滚动。

答案 2 :(得分:2)

这是一种非常简单但有效的方法

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard:)];
gestureRecognizer.delegate = self;
[scrollView addGestureRecognizer:gestureRecognizer];

-(void) hideKeyBoard:(id) sender
{
   // Do whatever such as hiding the keyboard
}