需要 UIResponder 链说明
Posted
技术标签:
【中文标题】需要 UIResponder 链说明【英文标题】:UIResponder Chain Explanation Needed 【发布时间】:2011-06-14 10:48:24 【问题描述】:我无法让我的UIButtons
、UIScrollViews
等在这种情况下工作:
我有基础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_overlayView
和nextController.view
将彼此视为兄弟姐妹而不是超级视图。因此,您对其中任何一个的触摸都不会报告给另一个,而是报告给基础superview
,这是兄弟姐妹共同的superview
。
因此你会发现中间层被绕过了。实际上,您的中间层是兄弟姐妹,不再是超级视图。希望至少能给你一些前进的道路;)
insertSubview:belowSubview:
在视图层次结构中的另一个视图下方插入一个视图。
(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview
参数:
view
要插入到另一个视图下方的视图。如果它不是siblingSubview 的兄弟,则会从其superview
中删除。
siblingSubview:
将在插入视图上方的同级视图。
讨论:
此方法保留视图并将其下一个响应者设置为接收者,即其新的superview
。
视图只能有一个超级视图。如果视图已经有superview
并且该视图不是接收者,则此方法会在将接收者设为新的superview
之前删除以前的superview
。
【讨论】:
嗨。感谢您及时的回复。我已经在我的所有 ViewController 中记录了 touchesBegan 等。这就是我能够发现它正在跳过我的中间层的方式。我只是不知道为什么:s。 啊,是的。这就是正在发生的事情。有谁知道我该如何解决这个问题?我可以在叠加层下方插入中间层,然后将叠加层的超级视图设置为中间层吗?以上是关于需要 UIResponder 链说明的主要内容,如果未能解决你的问题,请参考以下文章