如果在 iOS 屏幕上点击其他任何位置,会关闭菜单?

Posted

技术标签:

【中文标题】如果在 iOS 屏幕上点击其他任何位置,会关闭菜单?【英文标题】:Dismissing menu if tap anywhere else on the screen in iOS? 【发布时间】:2015-08-27 00:55:17 【问题描述】:

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

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

【问题讨论】:

我在源代码中看到了一个名为“dismissbuttons”的函数。也许你想在适当的时候调用它。 我也经历过。我只是不知道如何检测外部触摸,所以我可以调用dismissbuttons函数 【参考方案1】:

有两种方法:

第一种方法:

你可以为你的按钮和其他视图设置一个标签,你不希望菜单在被点击时被关闭:

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

然后在您的视图控制器中,使用 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 以了解类似情况。

【讨论】:

我现在能够检测到被点击的覆盖并在控制台上打印一条消息,但是我尝试像这样调用dismissbuttons方法:DWBubbleMenuButton().dismissButtons() 并且没有任何反应 好吧,这超出了这个问题的范围,但我认为你应该做一个单独的测试,你只想以任何可能的方式关闭按钮。完成此操作后,请尝试将它们合并为一个。 作为一个新手的美,现在在关闭菜单后遇到问题,清晰的覆盖仍然有交互,并且不允许与视图控制器进行任何交互 关闭按钮后,您还必须从超级视图中删除叠加层(否则会阻止您的交互)。此外,您可能希望在执行此操作之前从叠加层中删除所有手势识别器,以确保一切正常。这就是为什么我把覆盖作为一个全局变量。我已经更新了代码给你一个提示。【参考方案2】:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 
         super.touchesBegan(touches, withEvent: event)
         //retract menu

此函数检测背景点击。

【讨论】:

我在使用菜单的视图控制器中调用它吗?以及如何将菜单按钮的触摸与视图控制器屏幕的其余部分区分开来【参考方案3】:

我使用 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()

折叠菜单。

【讨论】:

以上是关于如果在 iOS 屏幕上点击其他任何位置,会关闭菜单?的主要内容,如果未能解决你的问题,请参考以下文章

当用户点击屏幕上的任意位置时调用函数

js完成点击任何位置都关闭下拉菜单

可以离开屏幕的可拖动叠加层?

JQuery隐藏可折叠菜单点击其他任何地方 - 模糊 -

如果单击 DOM 中的任何位置,则隐藏 div

防止在 iPad 上意外关闭 U​​IActionSheet