阻止用户与底层视图的交互
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 的交互