【问题标题】:Passing touch events on to subviews将触摸事件传递给子视图
【发布时间】:2010-04-06 19:55:25
【问题描述】:

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

似乎前几个事件正在由子视图处理,但随后调用 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...");
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    [scrollView setDelaysContentTouches:NO];
    

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

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多