9

UIViewUITableView. 我正在使用UITableView来显示一些数据,同时,我想覆盖一个跟随手指的动画(例如,留下痕迹)。

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

非常感谢您的帮助。

4

3 回答 3

12

我解决这个问题的方法不是那么干净,但它确实有效。请让我知道是否有更好的方法来做到这一点。

我已经覆盖hitTest了我的自定义UIView,以便将触摸指向UITableView下方。然后在UITableView我通过touchesBegan,等处理手势。在touchesMoved那里我也在调用.touchesBeganUIView

以这种方式,触摸由两个视图处理。我不这样做的原因(有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];
}
于 2011-12-08T21:40:06.373 回答
1

不,你不能隐含地做到这一点。事件交付章节说

窗口对象使用命中测试和响应者链来找到接收触摸事件的视图。在命中测试中,窗口在视图层次结构的最顶层视图上调用 hitTest:withEvent:;此方法通过在视图层次结构中返回 YES 的每个视图上递归调用 pointInside:withEvent: 来继续,沿着层次结构向下进行,直到找到发生触摸的子视图。该视图成为命中测试视图。

因此,当窗口找到触摸视图时,它返回 YES。当前只有一个视图可以处理触摸。

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

于 2011-12-03T20:35:49.180 回答
0

UITableView 将未处理的触摸事件中继到 UIView。(谷歌“响应者链”) UITableView 文档

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

  1. touchesstart - 做初始化的东西

  2. touchesmove - 在 UIView 上绘制尾部(使用计时器/延迟响应来禁用点,使其看起来像一条轨迹)

  3. touchesend - 做剩下的事情

希望这可以帮助。

于 2011-12-03T20:24:01.200 回答