需要 UIResponder 链说明

Posted

技术标签:

【中文标题】需要 UIResponder 链说明【英文标题】:UIResponder Chain Explanation Needed 【发布时间】:2011-06-14 10:48:24 【问题描述】:

我无法让我的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];

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

有人知道这里发生了什么吗?

是否可以通过创建两个UIEvents 来解决?一个用于覆盖视图,一个用于中间层视图?那可能吗?如果有,怎么做?

任何帮助将不胜感激。 谢谢, 丰富

【问题讨论】:

【参考方案1】:

edit1 开始:

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

现在,在您的中间视图中,您可以将识别器状态标识为 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

【讨论】:

嗨。感谢您及时的回复。我已经在我的所有 ViewController 中记录了 touchesBegan 等。这就是我能够发现它正在跳过我的中间层的方式。我只是不知道为什么:s。 啊,是的。这就是正在发生的事情。有谁知道我该如何解决这个问题?我可以在叠加层下方插入中间层,然后将叠加层的超级视图设置为中间层吗?

以上是关于需要 UIResponder 链说明的主要内容,如果未能解决你的问题,请参考以下文章

iOS之深入解析事件传递的响应链

UIResponder 链题

:多点触摸与手势检测

ios中事件的响应链(Responder chain)和传递链

iOS学习9_事件分发&响应链

当它说“无法处理事件”时是啥意思?