2010-03-18 74 views
4

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

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

回答

12

您可以在您的UIViewhitTest:withEvent:方法。

调用此方法来检查哪些子视图必须接收触摸事件,因此您也可以执行一些动作实际上发生之前。您也可以更改必须接收事件的子视图。

+0

辉煌。令人难以置信的辉煌。 – Tyler 2010-03-18 20:25:27

+0

但是,该方法的实现是什么?如果这是一个简单的触摸,'UIScrollView'将其子视图作为响应者。但如果它是一个滚动事件,'UIScrollView'将成为响应者并处理滚动事件。如何实现这个逻辑? – 2017-09-28 09:50:04

+0

@EdwardAnthony,坦白的7年后,我会说,加入UIGestureRecognizers您的自定义视图可能是正确的方式去(你可以检查标准的UIScrollView在默认情况下连接几个手势识别) – Vladimir 2017-10-01 00:21:20

3

[编辑:好吧,我以某种方式将问题看作与实际要求相反的问题。我会在这里留下这个以防万一有人好奇,但它与实际问题无关 - TechZen]

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

例如,你有一个滚动视图滑块水平滚动。用户触摸滑块。触摸是否打算滑动滑块或者是否是水平滚动的开始?哪个应该有优先权?

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

+0

哇,这是一个很好的信息! – eugene 2011-02-14 07:12:08

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 
}