Ios 如何检测按钮外的触摸(即在背景上)?

Ios 如何检测按钮外的触摸(即在背景上)?,ios,swift,uitapgesturerecognizer,touchesbegan,Ios,Swift,Uitapgesturerecognizer,Touchesbegan,我正在创建一个悬停按钮,以显示一个像收件箱应用程序一样的飞行菜单,并了解我与GitHub代码无关 到目前为止,我只是介绍了按钮,当用户点击它的背景模糊和更多的按钮显示。现在我想要的是,当用户点击按钮外部以及所有其他按钮时,用户只需触摸模糊的背景,模糊就会消失。 但现在我尝试的每一件事都包括按钮,还有tapGestureRcognizer、TouchesStart等等 我认为作为blurEffectView的子视图添加的TapGestureRecognitor会排除菜单按钮,但这不起作用。实际上,

我正在创建一个悬停按钮,以显示一个像收件箱应用程序一样的飞行菜单,并了解我与GitHub代码无关

到目前为止,我只是介绍了按钮,当用户点击它的背景模糊和更多的按钮显示。现在我想要的是,当用户点击按钮外部以及所有其他按钮时,用户只需触摸模糊的背景,模糊就会消失。 但现在我尝试的每一件事都包括按钮,还有tapGestureRcognizer、TouchesStart等等

我认为作为blurEffectView的子视图添加的TapGestureRecognitor会排除菜单按钮,但这不起作用。实际上,通常在触摸按钮时可以看到高光效果,但添加TapGestureRecognitor后,按钮上没有高光效果,所以我猜TapGestureRecognitor是最重要的

那么,我如何才能确保只有触摸过的背景才能消除模糊的视图呢

以下是我目前的代码:

按钮操作:

var blurredEffectView = UIVisualEffectView()
...
...

@IBAction func plusButtonPressed(_ sender: UIButton) {
    blurScene()

    var touch = UITapGestureRecognizer(target:self, action:#selector(dismissBlur))
    blurredEffectView.addGestureRecognizer(touch)

}

func blurScene() {

    let blurEffect = UIBlurEffect(style: .extraLight)
    blurredEffectView = UIVisualEffectView(effect: blurEffect)
    blurredEffectView.frame = view.bounds
    blurredEffectView.alpha = 0
    view.addSubview(blurredEffectView)

    UIView.animate(withDuration: 0.2, animations: {
        self.blurredEffectView.alpha = 1
    })
}

@objc func test() {
        UIView.animate(withDuration: 0.2, animations: {
        self.blurredEffectView.alpha = 0
    }, completion: {
        (true) in self.blurredEffectView.removeFromSuperview()
    })
}

再次显示和取消模糊背景效果很好,按钮保持在焦点位置,但无论我点击背景或按钮的位置,模糊视图都被取消,但我想排除这些按钮,因为它们显然有其他动作。

解决问题其实很简单

而不是将blurView添加为子视图

您需要在plusButton下面插入blurView

有关更多信息,请参阅。

只需添加此线条视图。sendSubviewtoBack:blurredEffectView在视图之后。addSubviewblurredEffectView

以下是一种方法:

1添加模糊视图,将其放置在视图层次的顶部,然后

2将作为UIButton的所有子视图移动到模糊视图上方

view.addSubview(blurredEffectView)
for view in view.subviews as [UIView] {
    if let button = view as? UIButton {
        view.bringSubview(toFront: button)
    }
}

如果在按下按钮后需要进行选择,您可以检查标记属性或标题文本。

我认为您的策略是正确的,这意味着我认为这会起作用。所以我的问题是,您的问题是否与视图层次结构有关。如果模糊视图位于最上方,则看起来按钮正在工作。添加模糊视图后,您确保将其发送到层次结构的后面是什么?由于视图中有两个标签,我尝试将按钮的zPosition更改为+20,并使用view.insertSubviewblurredEffectView,位置:+10-与以前一样工作,但TapGestureRecognitor覆盖了所有内容。我怎么能把它向下移动呢?我几乎投了@PredragSamardzic的赞成票,但是在你正确地提升你的等级之前,我会推迟。这里是规则。1添加子视图的顺序决定了层次结构。因此,如果你按UILabels的顺序添加东西,然后按blurredView的顺序添加,那么UIButtons你的层次结构是相反的——我想这是你想要的。但您可能会遇到一些干扰,即添加/删除模糊视图。因此:1a您是否可以隐藏模糊的视图,而不是添加/删除?我真的不知道。如果没有,则….2使用sendSubviewtoBack:或bringSubviewtoFront:的最简单组合。这取决于UIButton与非UIButton的数量。这可能是前者-因此添加模糊视图,然后在视图的子视图中循环UIButtons并使用bringSubviewtoFront:。如果你需要一段代码片段来循环和修改UIButtons,请告诉我,我会添加一个答案。我以前有过这个想法,使用zPositions将按钮放置在+20,将blurredEffectView放置在+10,这样它就位于按钮下方,但TapGestureRecognitor似乎覆盖了所有内容。我的想法是,因为它是blurredEffectView的子视图,所以它将位于sam层次结构位置,但显然它仍然位于所有内容的顶部!?尝试blurView.userInteractionEnabled=False,或者您可以一起删除tapguesture并使用触控开始方法,检查触控的位置并添加您的逻辑。这根本不起作用,因为它会将模糊的视图移动到所有内容后面的背景中!?在这种情况下,如果我正确理解您的层次结构,而不是view.addSubviewblurredEffectView,您可以尝试使用view.insertSubviewblurredEffectView,在子视图:plusButton下面