阻止用户与底层视图的交互

Posted

技术标签:

【中文标题】阻止用户与底层视图的交互【英文标题】:blocking user interaction with underlying views 【发布时间】:2011-09-01 14:22:10 【问题描述】:

在我的应用程序中,我有一个覆盖视图,当一些处理和网络发生时显示。它只是一个半透明视图(UIView 的子类),上面有一个加载指示器,填满了整个屏幕。

我想阻止任何底层视图接收用户交互(例如,不应滚动底层表视图,不要按下按钮)。

我可以从覆盖视图中执行此操作的最佳方法是什么?

【问题讨论】:

您的叠加视图是否位于视图堆栈的顶部? 【参考方案1】:

只需将覆盖视图的userInteractionEnabled 属性设置为YES。这将导致所有触摸事件都发生在覆盖视图上,而不是传递到底层视图。

【讨论】:

对我不起作用,我尝试在 init 和 loadView 中设置它,在这两种情况下,下面的按钮仍然会接收触摸事件。 @Ahti:你在使用 Interface Builder 吗? (我不认为你是,但只是确保。) @Ahti:我下面有一些精灵节点被击中。我修改了 hitTest:withEvent: 来为覆盖层本身返回一个屏幕外的虚拟按钮。按钮会吸收点击,什么也不做。【参考方案2】:

只需将 半透明覆盖视图 的属性 userInteractionEnabled 设置为 YES。

【讨论】:

【参考方案3】:

我认为最好的方法是使用这两种方法:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

在执行繁重的处理操作之前和分别完成之后。

【讨论】:

这是唯一对我有用的答案。无论您的叠加层在视图层次结构中的哪个位置,它都会起作用。我的叠加层位于滚动视图上,这是我可以在不更改滚动视图控制器的情况下防止滚动的唯一方法(因为叠加层被多个控制器使用)【参考方案4】:

只需确保覆盖视图及其所有父视图的 userInteractionEnabled 未设置为 NO、未隐藏且 alpha 不小于 0.01。然后用户的触摸将与覆盖层交互,而不是与它后面可见的视图交互。另请注意,它不会阻止其父视图未覆盖的区域中的交互:即使您的视图覆盖整个屏幕,如果其父视图仅为 10x10,那么它只会阻止其父视图覆盖的 10x10 区域内的交互。

您可能还需要确保在任何现有的第一响应者上调用resignFirstResponder,否则用户仍然可以通过键盘与其交互。

【讨论】:

以上是关于阻止用户与底层视图的交互的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIWebView 上显示覆盖而不阻止用户与 UIWebView 的交互

是否可以阻止触摸被添加到队列中?

使 UIView 接收点击,但将滑动传递给底层视图

当我更改 uiviews 子视图的状态时,我遇到了一个 uitoolbar 错误。

TableView 交互阻止单元格中的动画

TextField 正在阻止 TableView 滚动