首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要UIResponder链解释

需要UIResponder链解释
EN

Stack Overflow用户
提问于 2011-06-14 18:48:25
回答 1查看 1.4K关注 0票数 1

在这种情况下,我无法让我的UIButtonsUIScrollViews等正常工作:

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

对于不同的视图,中间层视图会定期更改。它使用的UIView来自UIViewController,由一个NIB文件生成。下面是一个例子

代码语言:javascript
复制
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];

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

有人知道这是怎么回事吗?

可以通过创建两个UIEvents来解决这个问题吗?一个用于覆盖视图,另一个用于中间层视图?这有可能吗?如果是这样的话,是怎么做的?

任何帮助都将不胜感激。谢谢你,瑞奇

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-14 19:17:23

edit1启动:

您可以将一个方法放到m_overlayView和initWithTarget中:您的中间视图操作:一些中间视图中的方法

现在,在你的中间视图中,你可以将recognizer.state标识为UIGestureRecognizerStateBegan,and等,然后做你想做的事情。

edit1结束:

您可以对其进行调试。只需在所有控制器中使用touchesbegan中的日志即可。通过记录触摸响应的顺序可以清楚地看到这一点。

好的..。因此,文档中对方法的描述可能会回答您的问题。您的m_overlayViewnextController.view将彼此视为兄弟,而不是superview。因此,您对它们中的任何一个的触摸都不会报告给另一个,而是报告给基本superview,这是两个兄弟姐妹的公共superview

因此,您会发现中间层被绕过了。实际上,您的中间层是兄弟层,不再是superview。希望这至少能给你一些前进的路;)

代码语言:javascript
复制
insertSubview:belowSubview:

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

代码语言:javascript
复制
(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview

参数

代码语言:javascript
复制
view

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

siblingSubview

将位于插入视图上方的同级视图。

讨论

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

视图只能有一个superview。如果查看器已经具有superview,且查看器不是接收器,则此方法在使接收器成为其新superview之前删除先前的superview

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6342352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档