将触摸事件传递到子视图

时间:2010-04-06 19:55:25

标签: iphone cocoa-touch iphone-sdk-3.0

我在UIScrollView中有一个视图,当用户按某个区域时,它会加载一个额外的子视图。当这个额外的子视图可见时,我希望所有触摸事件都由此处理 - 而不是由scrollview处理。

看起来子视图正在处理前几个事件,但随后调用了touchesCancelled并且滚动视图接管了触摸检测。

只要在此视图上执行移动活动,我如何确保子视图获取所有事件?

这是我在touchesMoved的实施 - 我认为这样做了......

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[touches allObjects] objectAtIndex:0];
    CGPoint touchPt = [touch locationInView:self];

    UIView *hitView = [self hitTest:touchPt withEvent:event];
    UIView *mySubView = subviewCtrl.view;

    if(hitView == mySubView) {
        [subviewCtrl.view touchesMoved:touches withEvent:event];
    }
    else {
        NSLog(@"Outside of view...");
    }
}

1 个答案:

答案 0 :(得分:1)

响应者链层次结构“通常”从子视图到超级视图,因此您不需要在超级视图中执行hitTest。您遇到的问题不是您需要superview在子视图上调用touchesMoved,而是UIScrollView通过拦截触摸事件来颠覆正常响应者链层次结构,以便为用户提供平滑的滚动体验。如果您不想要此行为,则可以通过向其发送以下消息来禁用此行为:

[scrollView setDelaysContentTouches:NO];

请注意,这将确保您的子视图首先处理有问题的事件(假设它实际上是第一响应者)。这可能会对scrollView的滚动和缩放性能产生负面影响,但这可能是Apple默认将其设置为YES的原因。