iOS:如何在UI元素处理事件之前拦截触摸事件

时间:2014-07-13 11:38:36

标签: ios objective-c cocoa-touch

在iOS应用中,我按一个按钮,然后会显示一个弹出菜单。 如果我在菜单外的屏幕中触摸任何位置(UITableView,其他UIButton),我希望弹出菜单关闭。 如何在屏幕上的UI元素(如UITableViewUIButton)处理事件之前拦截触摸事件,以便以编程方式关闭菜单?

我在-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event中尝试了UIViewController,但它不起作用。我触摸的UI元素将处理事件,因此我无法拦截事件。

3 个答案:

答案 0 :(得分:3)

在菜单下添加覆盖整个屏幕的透明UIView。然后只处理此视图的点击。

答案 1 :(得分:0)

在菜单可见时,将所有视图的userInterActionEnabled属性设置为NO。丢弃后,再次将其设置为YES。

- (void) enableOrDisableControlsExceptMenu : (UIView *) parentView :(bool) bEnabled
{
    for (UIView * view in parentView.subviews)
    {
       if (![view isKindOfClass:[YourMenu class])   //YourMenu is the menu view class
           view.userInterActionEnabled = bEnabled;
       [self enableOrDisableControlsExceptMenu : view :bEnabled];
    }
}

当菜单可见时,请调用上述方法,如:

[self enableOrDisableControlsExceptMenu:self.view :NO];

当菜单被丢弃(不可见)时,请将其称为:

[self enableOrDisableControlsExceptMenu:self.view :YES];

答案 2 :(得分:0)

您可以在主窗口中添加UIGestureRecognizer并拦截触摸。如果你想要的只是一个点击,那么UITapGestureRecognizer应该完成这项工作。

如果您正在寻找任何类型的触摸,那么我建议使用实现touchesBegan的自定义GestureRecognizer。