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