UIResponder链解释需要

时间:2011-06-14 10:48:25

标签: ios uiviewcontroller uikit uiresponder uievent

我无法让UIButtonsUIScrollViews等在这种情况下工作:

我有基座UIViewController,它是UIWindow的根控制器。 在该层之上,我添加了一些其他UIViews,我将其称为“中间层视图”。在顶部,我为叠加对象添加了另一个UIView

定期更改中间层视图以查看不同的视图。它使用的UIView来自UIViewController,由NIB文件生成。这是一个例子

if ( mode == eModeShowView1 )
    UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View1"...
else if ( mode == eModeShowView2 )
    UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View2"...

[UIView insertSubview:nextController.view below:m_overlayView];

现在,当我触摸屏幕时,第一个响应者显然是OverlayViewUIResponder上已被触摸的任何OverlayView。 触摸输入的UIEvent上升到视图链,但似乎完全跳过了中间层视图和UIResponders上的UIView。它直接跳到根UIViewController

有谁知道这里发生了什么?

可以通过某种方式创建两个UIEvents来解决吗?一个用于叠加视图,一个用于中间层视图?那可能吗?如果是这样,怎么样?

任何帮助都将非常感激。 谢谢, 富

1 个答案:

答案 0 :(得分:0)

edit1开始:

您可以将UITapGestureRecognizer放到m_overlayView和initWithTarget:your-middleview action:some-method-in-middleview

现在,在您的中间视图中,您可以将Recognizer.state识别为UIGestureRecognizerStateBegan,Ended等,并执行您想要执行的操作。

edit1结束:

你可以调试它。只需在所有控制器中使用touchesbegan中的日志即可。通过日志可以清楚地了解触摸响应的顺序。

好的..所以文档中对方法的描述可能会回答你。您的m_overlayViewnextController.view彼此视为兄弟姐妹,而不是超级视图。因此,您对其中任何一个的触摸都不会报告给其他人,而是报告给基础superview,这对兄弟姐妹来说都是superview

因此,您正在绕过中间层。实际上你的中间层是一个兄弟,而不再是一个超级视图。希望至少能为你提供一些方法;)

insertSubview:belowSubview:

在视图层次结构中的另一个视图下方插入视图。

(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview

<强>参数

view

要在另一个视图下方插入的视图。如果它不是siblingSubview的兄弟,它会从superview中删除。

<强> siblingSubview

将在插入的视图上方的兄弟视图。

<强>讨论

此方法保留视图并将其下一个响应者设置为接收者,即新的superview

视图只能有一个超级视图。如果视图已经有superview并且该视图不是接收者,则此方法会在使接收者成为新superview之前删除之前的superview