我有一个简单的视图层次结构示例。
显然,主视图空间是用户与之交互的主要空间。在底部,我有一些标签,可以弹出以指示用户他/她在应用程序的进展中。通常,这些选项卡仅占用底部“自定义选项卡”矩形所指示的空间,但它们可以一直向上扩展以填充“空白空间”框。
为了使标签仍然可以点击,我必须使标签视图的框架成为包含“自定义标签”空间和“空格”空间的完整矩形。这导致“空闲空间”在弹出选项卡时不与用户交互,因为输入基本上被该UIView使用,而不是通过层次结构的其余部分转发。
我认为这个问题的根源是“主视图空间”和“空格+自定义选项卡”都是主窗口的子视图。
如果用户没有主动点击交互式元素,有没有办法告诉系统将用户输入转发给兄弟视图?例如,使用touchesBegan
,touchesEnded
等方法执行操作,这些方法将向操作系统指示此视图未使用输入。
修改
这是视图的另一个版本,展示了一个标签打开的状态:
EDIT2
经过一些简单的测试后,似乎默认行为是最顶层的视图首先获得输入。即使您在UIView
之上有明确的UITextField
,这也适用。清除UIView
将消耗输入,阻止UITextField
可编辑
EDIT3
标签应该起作用的方式是用户可以点击标签(尺寸与第一张图片一样),然后它将展开以显示与该标签相关联的缩略图视图(如第二张图片中所示)。然后,用户可以选择再次点击标签以将其关闭,并将尺寸返回到原始图片。为了使标签在打开时可以点击,我必须使包含视图基本上足够大,以包含所有4个标签,就好像它们是打开的一样。这会在包含视图中产生大量空白空间。这个空白空间导致屏幕上基本上死的输入空间。如果主视图空间中有一个空白空间覆盖的按钮,则用户将无法单击该按钮。我希望能够避免这种行为,并且空白空间覆盖的按钮仍然可以点击。
答案 0 :(得分: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;
可能需要进行一些调整才能使内容显示在您喜欢的位置,但这样,当选项卡最小化时,您无需执行任何额外操作即可使主视图正确响应触摸。
答案 1 :(得分:0)
好的,这就是我这样做的方式:
RootViewController有两个视图,它的主视图占据整个屏幕,是一个添加到窗口的视图。和标签视图。
然后我会将另一个视图控制器(理想情况下是UINavigationController)添加到RootViewController中,我会将其视图添加为RootViewController视图的子视图。
执行任何更改,例如推送新视图控制器或其他任何更改,都将对子视图控制器执行。
这样,您的标签视图将始终显示。要打开选项卡,您可以使用动画或类似内容创建一个显示在选项卡栏顶部的新视图。