7

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

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

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

触摸事件适用于子视图控制器的主视图,但任何按钮上的任何触摸都无法识别 TAP 事件。

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

4

3 回答 3

7

你不应该这样做

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

打开菜单后,您应该在 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");
}
于 2014-07-16T11:42:58.620 回答
1

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

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

于 2014-07-16T11:31:47.630 回答
0

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

[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];
于 2014-07-16T12:25:32.360 回答