【问题标题】:iOS view controller containment | Child View Controller passes touches to Parent View ControlleriOS 视图控制器遏制 |子视图控制器将触摸传递给父视图控制器
【发布时间】:2014-08-14 11:13:41
【问题描述】:

iOS5 中,我在一个应用程序中使用UIViewController 遏制,我在几个地方实现了UITouchGesture

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

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

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

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

容器只是一个 UIView,childViewController 和其他 UIView 对象的视图位于其上。 谢谢

【问题讨论】:

    标签: ios objective-c ios5


    【解决方案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 中禁用手势识别器,并在删除子视图控制器并且 MPFlipViewController 再次位于顶部时再次启用它们.为此,请使用 enabled 属性。

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

    【讨论】:

    • 谢谢,我稍微修改了我的问题,我没有在 ChildViewController 上使用手势识别器,用户只是将手指放在子视图中的屏幕上,而父视图上的 MPFlipViewController 是吸收触摸并移动“页面”
    • 我更新了答案。但是子视图控制器会对它收到的触摸做出反应吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 我修改了我的问题,它不是标准的 View Hierachy 东西,因为我将 ViewController 添加为 childViewController,它仍然将触摸传递给它所来自的父级上的 UIView 对象:)。
    • 除非你在那个方向手动传递触摸,否则 UIKit 不是这样工作的。查找触摸下方最局部视图的搜索从最顶部视图向下下降。所以从父母到孩子。反之亦然。控制器包含添加到正常的视图管理中,它不会改变基本原理。您认为如何找到触摸下的视图?
    【解决方案3】:

    您应该为子视图控制器实现触摸处理。允许孩子捕获所有触摸事件,然后将它们放下,这样它们就不会传递给父母。

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

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

    【讨论】:

      【解决方案4】:

      在 iOS 7 发布之前这是不可能的,我想知道现在有没有大师能做到这一点。

      【讨论】:

      • 那么在 iOS7 中我该怎么做才能阻止这种情况呢?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多