如果在 iOS 中点击屏幕上的其他任何地方,是否会关闭菜单?

Dismissing menu if tap anywhere else on the screen in iOS?

所以我正在使用来自 github 的 Menu。目前,如果您再次单击点击按钮,菜单会在点击时打开并缩回,但我还希望如果用户点击屏幕上除按钮以外的任何其他地方,菜单也会缩回。我遇到的问题 运行 是我在带有 tabbarcontroller 的导航栏中实现这个,如果我点击按钮打开菜单然后单击不同的选项卡而不折叠气泡菜单,会发生什么情况。然后,如果我回到同一个选项卡,气泡菜单在视觉上仍然打开,但在代码中它仍然认为它已折叠,这会导致添加另一个子视图的奇怪行为有什么建议吗?

下面是它现在如何工作的例子。这是 link to the Code.

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
         super.touchesBegan(touches, withEvent: event)
         //retract menu
}

此函数检测背景点击。

有两种方法:

第一种方法:

您可以为您的按钮和其他视图设置一个标签,您不希望菜单在它们被点击时消失:

button.tag=99;
button2.tag=99;
backgroundImage.tag=99;

然后在您的 viewcontroller 中,使用 touchesBegan:withEvent: 委托

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{


    UITouch *touch = [touches anyObject];

    if(touch.view.tag!=99){
        //Call your dismiss method
    }

}

第二种方法:

如果您的按钮有叠加层(例如背景突出显示您的按钮,并填充整个视图),您可以向其添加 UITapGestureRecognizer,并在每次您将其添加到您的视图中希望您的自定义视图显示出来。这是一个例子:

UIView *overlay;

-(void)addOverlay{
    //Add the overlay, if there's one in your code, then you don't have to create this
        overlay = [[UIView alloc] initWithFrame:CGRectMake(0,  0,self.view.frame.size.width, self.view.frame.size.height)];
    [overlay setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]];

    //Register the tap gesture recognizer
    UITapGestureRecognizer *overlayTap =
    [[UITapGestureRecognizer alloc] initWithTarget:self
                                        action:@selector(onOverlayTapped)];

    [overlay addGestureRecognizer:overlayTap];

    [self.view addSubview:overlay];
}


- (void)onOverlayTapped
{
   //Call your dismiss method

    for (UITapGestureRecognizer *ges in previewOverlay.gestureRecognizers) {
        [overlay removeGestureRecognizer:ges];
    }
    [overlay removeFromSuperview];

}

您可以在此处查看 my answer 类似案例。

我使用 FlysoFast 代码并将其转换为 Swift,以检测外部水龙头:

self.overlay = UIView(frame: UIScreen.mainScreen().bounds)
self.overlay.backgroundColor = UIColor.clearColor()
downMenuButton.delegate = self
let tap = UITapGestureRecognizer(target: self, action: Selector("bubbleMenuButtonShouldCollapse"))

tap.numberOfTapsRequired = 1
self.overlay.addGestureRecognizer(tap)
self.overlay.addSubview(downMenuButton)
self.navigationController!.view.addSubview(overlay)

然后我使用了下面的代码:

func bubbleMenuButtonShouldCollapse() {
   println("Overlay tapped")
   self.downMenuButton.dismissButtons()
}

折叠菜单。