objective-c - 如何防止 UIView 消耗用户输入

标签 objective-c ios user-input

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

enter image description here

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

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

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

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

编辑

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

enter image description here

EDIT2

经过一些简单的测试,默认行为似乎是最顶层的 View 首先获得输入。即使您在 UITextField 之上有一个清晰的 UIView 也是如此。清晰的 UIView 将消耗输入,阻止 UITextField 可编辑

EDIT3

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

最佳答案

与其尝试“转发”触摸,不如修改您的布局,使选项卡 View 仅与选项卡一样大,并将其 .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.

关于objective-c - 如何防止 UIView 消耗用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11524440/

相关文章:

objective-c - 在 Obj-C 中过度使用点运算符的替代方法是什么?

ios - 如何使用ReactiveCocoa每3秒发送一次信号

ios - 如何在 Realm (iOS) 中同步写入操作?

c - 如何使用 GLib 获取基于文本的用户输入

java - 为什么每次都要连续两次要求用户输入?

iphone - 什么是线性 PCM 值

ios - UIPopoverController 不会初始化 ContentViewController

objective-c - 设置div高度相对于UIWebView的frame.size

c - 生成从 1 到 limit 的所有可能的不重复整数

ios - 按标签查找单元格的indexPath