【问题标题】:How to detect touch event in child viewcontroller in ios如何在 ios 的子视图控制器中检测触摸事件
【发布时间】:2014-09-06 21:43:37
【问题描述】:

我为 iPhone 创建了一个类似侧视图的菜单,我使用集装箱船概念在父视图控制器中添加子视图控制器。当用户点击导航栏上的菜单按钮时,我只是将子视图控制器的框架更改为像显示菜单一样对其进行动画处理,以便子视图控制器将其框架的一半剪裁到右侧。

现在我的问题是每当用户点击子视图控制器的任何部分时,我只想通知其父视图控制器触摸事件已在其子视图控制器上触发,以便父视图控制器可以重置子视图控制器的框架像关闭一半显示的菜单一样对其进行动画处理。

我使用了点击手势并将其添加到子视图控制器子视图的每个子视图中。因此任何子视图上的点击手势都会通知父视图控制器有关触摸事件的信息。

触摸事件对于子视图控制器的主视图工作正常,但任何按钮上的任何触摸都无法识别 TAP 事件。

我不知道我在哪里弄错了。请帮助我如何通知父视图控制器其子视图控制器中的任何触摸。提前致谢。

【问题讨论】:

  • 你可以使用相同的开源库来做 drower 吗?我使用了 RESideMenu。它有一些有趣的效果,并且内置了所有的点击处理。
  • 不,我有一个选择,但我不想使用任何第三方库:)
  • 按钮将取消点击事件...在半关闭时禁用用户输入操作
  • 半关闭时在您的子视图控制器上添加一个矩形 320x 高度的框架视图。在此视图上添加点击。
  • 可以借助委托方法。您能否显示有关如何将侧边菜单添加到父控制器的代码,以便我可以帮助您提供可以在此处使用的代码。

标签: ios iphone touch-event childviewcontroller parentviewcontroller


【解决方案1】:

你不应该这样做

“我使用了轻击手势并将其添加到子视图控制器子视图的每个子视图

打开菜单后,您应该在 parentviewcontroller 的视图之上添加一个覆盖视图。所以它将停留在左右视图的顶部。

您应该在其上添加点击识别器以销毁/隐藏覆盖视图并在那里执行菜单隐藏动画。请看下面的代码

-(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");
}

【讨论】:

    【解决方案2】:

    我认为您可能忘记将按钮的userInteractionEnabled 属性设置为YES,这会阻止它们接收事件。

    至于将事件传递给另一个视图控制器,最好创建一个委托协议,您的子视图控制器可以使用该协议将消息发送回它的父视图控制器。

    【讨论】:

      【解决方案3】:

      如果您缺少子视图中按钮的触摸事件,请尝试为按钮添加目标。

      [button addTarget:<#(id)#> action:<#(SEL)#> forControlEvents:UIControlEventTouchUpInside];
      

      通知 parentViewcontroller 从 childViewController 中的选择器函数向您发布通知。

      [[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];
      

      【讨论】:

        猜你喜欢
        • 2013-05-08
        • 2021-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多