如何在iOS中检测子视图控制器中的触摸事件

7
我为iPhone创建了一个侧边菜单,使用容器船概念将子视图控制器添加到父视图控制器中。当用户在导航栏上点击菜单按钮时,我只是改变子视图控制器的框架,以动画方式显示它,就像一个揭示菜单一样,这样子视图控制器的一半框架会被剪裁到右边。
现在我的问题是,每当用户点击子视图控制器的任何部分时,我只想通知其父视图控制器触摸事件已在其子视图控制器上触发,以便父视图控制器可以重置子视图控制器的框架,以动画方式关闭半个显示的菜单。
我使用了轻拍手势,并将其添加到子视图控制器的所有子视图中。因此,对任何子视图上的轻拍手势都会通知父视图控制器有关触摸事件的信息。
触摸事件对于子视图控制器的主视图有效,但任何按钮上的触摸都无法识别TAP事件。
我不知道我错在哪里。请帮助我如何通知父视图控制器其子视图控制器中的任何触摸事件。先行致谢。

你能在抽屉中使用同一个开源库吗?我用的是RESideMenu。它有一些有趣的效果,并且已经内置了所有的点击处理。 - Marko Zadravec
不,我有一个选项,但我不想使用任何第三方库 :) - Dhaval H. Nena
按钮将会取消掉点击事件...当半闭时禁用它们的用户交互。 - amar
当半关闭时,在您的子视图控制器上添加一个尺寸为320x高度的框架视图。在此视图上添加轻击手势。 - amar
你可以使用委托方法来帮助实现。你能展示一下如何将侧边菜单添加到父控制器的代码吗?这样我就可以帮你提供在此处使用的代码了。 - try catch finally
3个回答

7

不要这样做

"我已经使用了轻触手势,并将其添加到子视图控制器的每个子视图中"

在打开菜单后,您应该向parentviewcontroller的视图顶部添加一个覆盖视图,以便它保持在左侧和右侧视图的上方。

您应该在其上添加tap recogniser以销毁/隐藏overlay view并在那里执行Menu Hide动画。请参见以下代码:

-(void)afterMenuOpened{

    UIViewController *parentViewController = yourParentViewController;

    UIView *aOverLayView = [[UIView alloc]initWithFrame:parentViewController.view.bounds];

    aOverLayView.backgroundColor = [UIColor clearColor];

    UITapGestureRecognizer *tapRecog = [[UITapGestureRecognizer alloc] initWithTarget:parentViewController action:@selector(OverLayDidTap:)];

    tapRecog.numberOfTapsRequired = 1;

    [aOverLayView addGestureRecognizer:tapRecog];

    [parentViewController.view addSubview:aOverLayView];


}

- (void)OverLayDidTap:(UITapGestureRecognizer*)sender {
//    sender.view.hidden = YES;
    NSLog(@"Hide Menu by resetting the menu frame");
}

1
我认为您可能忘记了将按钮的userInteractionEnabled属性设置为YES,这会阻止它们接收事件。
至于将事件传递给其他视图控制器,最好创建一个委托协议,供子视图控制器使用以向其父视图控制器发送消息。

0
如果你在子视图的按钮上缺少触摸事件,请尝试为按钮添加目标。
[button addTarget:<#(id)#> action:<#(SEL)#> forControlEvents:UIControlEventTouchUpInside];

在编程中,从子视图控制器的选择器函数向父视图控制器发送通知。
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificaiton_name" object:object_you_want_to_send];

在您的父视图控制器中添加 NSNotificationCenter 的观察者。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method_you_want_to_call:) name:@"notificaiton_name" object:nil];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接