我在UITableView
的顶部有一个UIView
的子类。我使用UITableView
来显示一些数据,同时我想覆盖手指后面的动画(例如,留下踪迹)。由多个视图处理的触摸事件
如果我弄清楚了,我需要处理的,UIView
子类和UITableView
。我怎样才能做到这一点? 是否有可能有,即touchesMoved
在UIView子类上触发,然后在UITableView
上触发?
非常感谢你的任何帮助。
我在UITableView
的顶部有一个UIView
的子类。我使用UITableView
来显示一些数据,同时我想覆盖手指后面的动画(例如,留下踪迹)。由多个视图处理的触摸事件
如果我弄清楚了,我需要处理的,UIView
子类和UITableView
。我怎样才能做到这一点? 是否有可能有,即touchesMoved
在UIView子类上触发,然后在UITableView
上触发?
非常感谢你的任何帮助。
我已经解决了这个问题的方式是不那么干净,但它的工作原理。请让我知道是否有更好的方法来做到这一点。
对于我的自定义UIView
,我已覆盖hitTest
,因此它会触摸下面的UITableView
。然后在UITableView
我通过touchesBegan
,touchesMoved
等处理手势。在UIView
上我还打电话touchesBegan
。
以这种方式,触摸由两个视图处理。 我之所以不采取其他方式(UIView
的touchesBegan
呼叫UITableView
的touchesBegan
)是因为UITableView
上的手势识别器不起作用。
UIView
子hitTest
- (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];
}
UITableView将未处理的触摸事件传递给UIView。 (谷歌“响应者链”) UITableView Documentation
所以,你只能在UIView中处理你的触摸事件。所以。在你的UIView
touchesstart - 做初始化的东西
touchesmove - 借鉴尾巴上的UIView(使用定时器/ delayedresponse到desable点,以便它看起来像一个线索)
touchesend - 做剩余的东西
希望这会有所帮助。
感谢您的答复,但我不知道我完全理解(特别是我不明白第一句的意思) 。我知道我可以在UIView中绘制轨迹,但我仍然需要将触摸事件“传递”到UITableView(滚动,选择等)。对不起,如果我误解了。 –
在Objective-C中,有一些称为响应链的东西。如果一个类没有处理特定的事件,那么这些事件需要由它的超类来处理。如果没有类处理该事件,则最终该事件由NSObject处理。所以,就你的情况而言,UIView是UITableView的超类,你可以从UIView响应UITableView事件。 – riship89
如果我对Objective-C没有特别的专业知识,我表示歉意......请问您可以举一个例子说明这可能适用于可能的情况吗?我应该有手势的UITableView句柄,然后将它们传递给超类?怎么样? –
不,你不能这么做。 Event Delivery章说
窗口对象使用命中测试和响应链,找到 视图接收触摸事件。在命中测试中,窗口调用 hitTest:withEvent:在视图层次结构的最顶层视图中;这个 方法继续通过递归调用pointInside:withEvent:在视图层次结构中的每个 视图返回YES,继续执行 层次结构,直到找到在其边界内触摸 发生的子视图。这一观点成为命中测试的观点。
所以,当窗口发现触摸视图时,它返回YES。只有一个视图可以处理当前时刻的触摸。
但是,如果您需要处理UITableView的事件,然后处理它的UIView!你可以使用– convertPoint,– convertRect函数将触点转换为所需的坐标,将子视图添加到UITableView,并根据坐标和其他许多事项来移动它。
这绝对可以工作。我可能在UIView子类下有多个元素......我是否需要为所有这些元素重复这个过程?另外,我是否需要转换坐标以获取全局坐标,对不对?谢谢。 –
我按照你的建议做了,但是我不能再滚动UITableView。你知道为什么吗?谢谢 –
非常酷..我打算在一段时间后做类似的事情。感谢发布。 – riship89
我真的很喜欢这个。我试了很长时间,通过在子视图上手动调用TouchesBegan等方法来做到这一点。这种方法很好用! – Gandalf458