如果在 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 屏幕上点击其他任何位置,会关闭菜单?的主要内容,如果未能解决你的问题,请参考以下文章