2011-12-03 54 views
7

我在UITableView的顶部有一个UIView的子类。我使用UITableView来显示一些数据,同时我想覆盖手指后面的动画(例如,留下踪迹)。由多个视图处理的触摸事件

如果我弄清楚了,我需要处理,UIView子类和UITableView。我怎样才能做到这一点? 是否有可能有,即touchesMoved在UIView子类上触发,然后在UITableView上触发?

非常感谢你的任何帮助。

回答

10

我已经解决了这个问题的方式是不那么干净,但它的工作原理。请让我知道是否有更好的方法来做到这一点。

对于我的自定义UIView,我已覆盖hitTest,因此它会触摸下面的UITableView。然后在UITableView我通过touchesBegan,touchesMoved等处理手势。在UIView上我还打电话touchesBegan

以这种方式,触摸由两个视图处理。 我之所以不采取其他方式(UIViewtouchesBegan呼叫UITableViewtouchesBegan)是因为UITableView上的手势识别器不起作用。

UIViewhitTest

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // tview is the UITableView subclass instance 
    CGPoint tViewHit = [tView convertPoint:point fromView:self];   
    if ([tView pointInside:tViewHit withEvent:event]) return tView; 

    return [super hitTest:point withEvent:event]; 
} 

UITableView子类的touchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    // .... 

    // view is the UIView's subclass instance 
    [view touchesBegan:touches withEvent:event]; 
} 
+0

非常酷..我打算在一段时间后做类似的事情。感谢发布。 – riship89

+0

我真的很喜欢这个。我试了很长时间,通过在子视图上手动调用TouchesBegan等方法来做到这一点。这种方法很好用! – Gandalf458

0

UITableView将未处理的触摸事件传递给UIView。 (谷歌“响应者链”) UITableView Documentation

所以,你只能在UIView中处理你的触摸事件。所以。在你的UIView

  1. touchesstart - 做初始化的东西

  2. touchesmove - 借鉴尾巴上的UIView(使用定时器/ delayedresponse到desa​​ble点,以便它看起来像一个线索)

  3. touchesend - 做剩余的东西

希望这会有所帮助。

+0

感谢您的答复,但我不知道我完全理解(特别是我不明白第一句的意思) 。我知道我可以在UIView中绘制轨迹,但我仍然需要将触摸事件“传递”到UITableView(滚动,选择等)。对不起,如果我误解了。 –

+0

在Objective-C中,有一些称为响应链的东西。如果一个类没有处理特定的事件,那么这些事件需要由它的超类来处理。如果没有类处理该事件,则最终该事件由NSObject处理。所以,就你的情况而言,UIView是UITableView的超类,你可以从UIView响应UITableView事件。 – riship89

+0

如果我对Objective-C没有特别的专业知识,我表示歉意......请问您可以举一个例子说明这可能适用于可能的情况吗?我应该有手势的UITableView句柄,然后将它们传递给超类?怎么样? –

1

不,你不能这么做。 Event Delivery章说

窗口对象使用命中测试和响应链,找到 视图接收触摸事件。在命中测试中,窗口调用 hitTest:withEvent:在视图层次结构的最顶层视图中;这个 方法继续通过递归调用pointInside:withEvent:在视图层次结构中的每个 视图返回YES,继续执行 层次结构,直到找到在其边界内触摸 发生的子视图。这一观点成为命中测试的观点。

所以,当窗口发现触摸视图时,它返回YES。只有一个视图可以处理当前时刻的触摸。

但是,如果您需要处理UITableView的事件,然后处理它的UIView!你可以使用– convertPoint– convertRect函数将触点转换为所需的坐标,将子视图添加到UITableView,并根据坐标和其他许多事项来移动它。

+0

这绝对可以工作。我可能在UIView子类下有多个元素......我是否需要为所有这些元素重复这个过程?另外,我是否需要转换坐标以获取全局坐标,对不对?谢谢。 –

+0

我按照你的建议做了,但是我不能再滚动UITableView。你知道为什么吗?谢谢 –