如果在 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()
}
折叠菜单。
所以我正在使用来自 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()
}
折叠菜单。