带有 alpha 设置的 UIView 的点击事件转到底层按钮

Posted

技术标签:

【中文标题】带有 alpha 设置的 UIView 的点击事件转到底层按钮【英文标题】:Tap event for a UIView with alpha set going to underlying button 【发布时间】:2018-04-21 04:30:56 【问题描述】:

当从服务器加载数据时,我们使用 UIView 屏蔽我们的 UI,如下示例代码:

let loadingView = UIView()
loadingView.tag = 9999
loadingView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
loadingView.backgroundColor = UIColor.white.withAlphaComponent(0.4);

controller.view.addSubview(loadingView)

正如你所见,这个 loadingView 占用了控制器的整个宽度和高度,实际上遮住了屏幕。拥有 alpha 意味着底层内容是半透明可见的。加载数据后,我们从控制器中删除此视图:

for view in controller.view.subviews

    if view.tag == 9999
    
        view.removeFromSuperview()
    

然而,我们看到了一个奇怪的问题——如果用户在显示 loadingView 时继续点击控制器上的 UIButton,那么在从控制器中移除 loadingView 后,点击按钮会被多次调用。换句话说,在显示 loadingView 时,我们的 UIButton 点击​​操作会被调用多少次。

我们做错了吗?我们如何防止在显示 loadingView 时调用 UIButton 上的点击?

【问题讨论】:

开启loadingView的用户交互。 【参考方案1】:

您应该在加载视图上进行用户交互。

loadingViee.userInteractionEnabled = false

正如你所说,加载视图在整个屏幕上。

【讨论】:

【参考方案2】:

您可以在加载视图期间忽略屏幕触摸完成加载视图后,您可以继续进行交互,如下所示。

UIApplication.shared.beginIgnoringInteractionEvents()
UIApplication.shared.endIgnoringInteractionEvents()

【讨论】:

以上是关于带有 alpha 设置的 UIView 的点击事件转到底层按钮的主要内容,如果未能解决你的问题,请参考以下文章

UIView alpha 0 但仍接收触摸事件?

将带有 alpha 1 的 UIView 放在带有 alpha 0.5 的 UIView 之上

Xcode iOS UIView 带有点击手势,允许在子视图上输入

带有点击事件的 UITapGestureRecognizer

使用 UIViewPropertyAnimator 依次为 UIView 的 alpha 设置动画

当我通过点击创建 UIView 时,如何不让它们重叠?