我UIView
在UITableView
. 我正在使用UITableView
来显示一些数据,同时,我想覆盖一个跟随手指的动画(例如,留下痕迹)。
如果我做对了,我需要UIView
子类和UITableView
. 我怎样才能做到这一点?是否有可能,即touchesMoved
在 UIView 子类上触发,然后在上触发UITableView
?
非常感谢您的帮助。
我UIView
在UITableView
. 我正在使用UITableView
来显示一些数据,同时,我想覆盖一个跟随手指的动画(例如,留下痕迹)。
如果我做对了,我需要UIView
子类和UITableView
. 我怎样才能做到这一点?是否有可能,即touchesMoved
在 UIView 子类上触发,然后在上触发UITableView
?
非常感谢您的帮助。
我解决这个问题的方法不是那么干净,但它确实有效。请让我知道是否有更好的方法来做到这一点。
我已经覆盖hitTest
了我的自定义UIView
,以便将触摸指向UITableView
下方。然后在UITableView
我通过touchesBegan
,等处理手势。在touchesMoved
那里我也在调用.touchesBegan
UIView
以这种方式,触摸由两个视图处理。我不这样做的原因(有UIView
'touchesBegan
调用UITableView
's 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];
}
不,你不能隐含地做到这一点。事件交付章节说
窗口对象使用命中测试和响应者链来找到接收触摸事件的视图。在命中测试中,窗口在视图层次结构的最顶层视图上调用 hitTest:withEvent:;此方法通过在视图层次结构中返回 YES 的每个视图上递归调用 pointInside:withEvent: 来继续,沿着层次结构向下进行,直到找到发生触摸的子视图。该视图成为命中测试视图。
因此,当窗口找到触摸视图时,它返回 YES。当前只有一个视图可以处理触摸。
但是,如果您需要为 UITableView 处理事件,则为 UIView 处理它!您可以使用- convertPoint,- convertRect函数将触摸点转换为所需的坐标,将子视图添加到 UITableView 并根据坐标移动它,以及许多其他事情。
UITableView 将未处理的触摸事件中继到 UIView。(谷歌“响应者链”) UITableView 文档
因此,您只能在 UIView 中处理您的触摸事件。所以。在你的 UIView
touchesstart - 做初始化的东西
touchesmove - 在 UIView 上绘制尾部(使用计时器/延迟响应来禁用点,使其看起来像一条轨迹)
touchesend - 做剩下的事情
希望这可以帮助。