我无法让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
或UIResponder
上已被触摸的任何OverlayView
。
触摸输入的UIEvent
上升到视图链,但似乎完全跳过了中间层视图和UIResponders
上的UIView
。它直接跳到根UIViewController
。
有谁知道这里发生了什么?
可以通过某种方式创建两个UIEvents
来解决吗?一个用于叠加视图,一个用于中间层视图?那可能吗?如果是这样,怎么样?
任何帮助都将非常感激。 谢谢, 富
答案 0 :(得分:0)
edit1开始:
您可以将UITapGestureRecognizer放到m_overlayView和initWithTarget:your-middleview action:some-method-in-middleview
现在,在您的中间视图中,您可以将Recognizer.state识别为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
。