iOS视图控制器包含|子视图控制器将触摸传递给父视图控制器

时间:2014-06-24 09:01:56

标签: ios objective-c ios5

iOS5中,我在我已在多个地方实施UIViewController的应用中使用UITouchGesture遏制。

当我添加一个孩子ViewController(全屏)时,触摸会传递给其父级。

如果有的话,解决这个问题的方法是什么。我使用MPFlipViewController,当用户将手指移过孩子ViewController时,我可以看到该页面在孩子下方转动。

为了澄清,我将我的ViewController添加为具有以下内容的子项:

[self addChildViewController:vc];
[vc willMoveToParentViewController:nil];
[self.container addSubview:vc.view];
[vc didMoveToParentViewController:self];

容器只是一个UIView,它是childViewController&其他UIView对象坐在上面。 感谢

4 个答案:

答案 0 :(得分:6)

你已经倒退了。控制器包含是一回事,但这只是标准的视图层次结构和响应者链的东西。所以触摸最初发送给父母;特别是对其观点-(UIView *)hitTest:withEvent:进行了调用。如果可以找到,则返回子视图。否则它返回自己的一个视图。可能它会自行返回。

如果父控制器正在捕获触摸,则意味着它从未被发送给孩子。并不是说它被发送给孩子然后上升到父母。

如果您希望父母使用触摸捕获做一些不寻常的事情,那么只需使用自定义视图并实现您自己的-hitTest:withEvent:。作为第一步,执行此操作并记录输入以查看发生的情况。

答案 1 :(得分:1)

在iOS 7发布之前,这是不可能的,我想知道现在是否有任何大师完成这项工作。

答案 2 :(得分:1)

您应该为子视图控制器实现触摸处理。允许孩子捕获所有触摸事件,然后将其删除,以便他们不会传递给父母。

另一个解决方案可能是将您的子视图控制器包装在UINavigationController中,这可能会让您免费获得该行为。

从父视图控制器发布UITouchGesture代码可能会有所帮助。

答案 3 :(得分:1)

MPFlipViewController.m中你应该看一下这个方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    // don't recognize simultaneously with scroll view gestures in content area
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]])
        return NO;

    // Allow simultanoues pan & swipe recognizers
    return YES;
}

将其更改为

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    // don't recognize simultaneously with scroll view gestures in content area
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]])
        return NO;

    if (otherGestureRecognizer == GestureRecognizerOfYourChildViewController)
        return NO;

    // Allow simultanoues pan & swipe recognizers
    return YES;
}

当然,GestureRecognizerOfYourChildViewController是您的子视图控制器的手势识别器。

编辑:由于OP没有在自己的子视图控制器上使用手势识别器,因此解决方案略有不同。我会在这里留下第一个版本,因为它可能对有类似问题的其他人有帮助。

我能想到的最佳解决方案是,当显示子视图控制器时,需要在MPFlipViewController中禁用gestureRecognizers,并在删除子视图控制器时再次启用它们MPFlipViewController再次登顶。请使用enabled属性。

手势识别器在您自己的视图控制器中使用的“触摸链”之外工作,这就是您的问题发生的原因。