4

我有一个简单的视图层次结构示例。

在此处输入图像描述

显然,主视图空间是用户将与之交互的主要空间。在底部,我有可以弹出的选项卡,以向用户指示他/她在应用程序的进展中所处的位置。通常,这些选项卡仅占用底部“自定义选项卡”矩形指示的空间,但它们可以一直向上扩展以填充“空白空间”框。

为了让选项卡仍然可以点击,我必须使选项卡视图的框架成为包含“自定义选项卡”空间和“空白空间”空间的完整矩形。这导致的是,当标签未弹出时,“空空间”没有与用户交互,因为该输入基本上是被Uiview所消耗的,而不是通过层次结构的其余部分转发。

我想这个问题的根源是“主视图空间”和“空白空间+自定义选项卡”都是主窗口的子视图。

如果用户没有主动点击交互式元素,有没有办法告诉系统将用户输入转发到同级视图?例如,使用touchesBegantouchesEnded方法向操作系统表明此视图未使用输入。

编辑

这是视图的另一个版本,展示了打开一个选项卡的状态:

在此处输入图像描述

编辑2

经过一些简单的测试,默认行为似乎是最顶层的视图首先获取输入。即使您UIViewUITextField. 清除UIView将消耗输入,防止UITextField可编辑

编辑3

选项卡的工作方式是用户可以点击选项卡(大小如第一张图片中所示),然后它将展开以显示与该选项卡关联的缩略图视图(如第二张图片中所示)。然后,用户可以选择再次点击选项卡以将其关闭,并将大小恢复为原始图片。为了使选项卡在打开时可单击,我必须让包含视图基本上足够大以包含所有 4 个选项卡,就好像它们已打开一样。这会导致包含视图中有大量空白空间。这个空白空间导致屏幕上的输入空间基本上是无效的。如果主视图空间中有一个按钮被空白区域覆盖,则用户将无法单击它。我希望能够避免这种行为,并且让空白区域覆盖的那个按钮仍然可以点击。

4

2 回答 2

0

我不会尝试“转发”触摸,而是修改您的布局,以便选项卡视图仅与选项卡一样大,并且.frame仅在您需要时将其更改为代码中的较大矩形。例如,单击选项卡时:

 CGRect tabFrame = tabView.bounds;
 tabFrame.origin.y = top_of_emptySpace;
 tabFrame.size.height = height_of_emptySpace + height_of_tabView;
 tabView.frame = tabFrame;

然后你可以添加你需要的内容。当您需要它消失时,删除内容然后执行:

 CGRect tabFrame = tabView.bounds;
 tabFrame.origin.y = top_of_tabView;
 tabFrame.size.height = height_of_tabView;
 tabView.frame = tabFrame;

There might be some tweaking required to make the content show up as you like, but this way, when the tabs are minimized, you won't have to do anything extra to make the main view respond to touches correctly.

于 2012-07-17T14:27:11.760 回答
0

好的,这就是我会这样做的方式:

RootViewController 有两个视图,它的主视图占据整个屏幕,一个被添加到窗口中。和标签视图。

然后我会将另一个视图控制器(理想情况下是 UINavigationController)添加到 RootViewController,并将其视图添加为 RootViewController 视图的子视图。

执行的任何更改,例如推送新的视图控制器或任何东西,都将在子视图控制器上完成。

这样,您的标签视图将始终显示。要打开选项卡,您可以使用动画或类似的东西创建一个新视图,该视图将显示在选项卡栏的顶部。

于 2012-07-17T14:49:12.983 回答