在VC包含中使用UINavigationController挖掘区域问题

时间:2015-01-16 20:26:43

标签: ios uinavigationcontroller uicontainerview

我有一个iOS应用程序,我在其中将UINavigationController作为子视图控制器添加到主屏幕。它是垂直排列的,因此导航控制器占据了主视图高度的底部并且是全宽的。有一个按钮(实际上是一个带有水龙头识别器的自定义视图),位于导航的正上方,用于隐藏和显示它;当导航被隐藏时,按钮位于主屏幕的底部,当显示导航时,按钮位于导航栏顶部的正上方。

问题是导航栏似乎拦截了按钮底部10点左右的触摸。这是为什么?

添加孩子的代码如下所示:

UIViewController *root = [[[UIViewController alloc]init]autorelease]; //some VC
UINavigationController *nav = [[[UINavigationController alloc]initWithRootViewController:root]autorelease];
[self addChildViewController:nav];
CGRect rect = self.view.frame;
CGFloat height = 500;
nav.view.frame = CGRectMake(0, rect.size.height - height, rect.size.width, height);
[self.view addSubview:nav.view];
[nav didMoveToParentViewController:self];

//Now the button
UIView *view = [[[UIView alloc]initWithFrame:CGRectZero]autorelease];
view.backgroundColor = [UIColor greenColor];
[self.view addSubview:view];
view.frame = CGRectMake(0, rect.size.height - 500 - 40, rect.size.width, 40);
UITapGestureRecognizer *recog = [[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(onToggleSplit)]autorelease];
[view addGestureRecognizer:recog];

onToggleSplit向上和向下动画导航。当它上升时,点击"按钮"的底部10点左右。没做什么。我尝试在我的自定义"按钮"上覆盖touchesBegan。看来,这甚至都没有被召唤。

如果我为子VC使用常规UIViewController(或其子类),按钮会按预期响应。

1 个答案:

答案 0 :(得分:0)

已经询问并回答here。基本上,iOS上的控件具有“斜面区域”,旨在允许用户方面的邋touch触摸精度。我将提交一个关于如何在控件的视图控制器范围之外不能达到的错误。

更新:作为雷达19504573提交。

更新2:我的雷达被标记为8088542的副本,该副本已打开。此外,我的情况有点简单(导航栏顶部的一个视图),所以我能够克服这个问题。我覆盖了hitTest:withEvent:并注意到当点击发生时,它会被调用两次。首先,触摸坐标是您所期望的,并且调用super将返回您期望的视图。第二个在事件上具有相同的timestamp值,但y坐标更高(屏幕下方更低),super返回导航栏。所以:

  • 子类UIView并添加属性viewToWatch
  • 在我的主视图控制器的nib / storyboard中,将视图类设置为我的子视图。
  • 在我的主视图控制器的viewDidLoad中,抓取视图,投射它,并将其viewToWatch设置为正在抓取其触摸事件的视图。
  • 在自定义视图中,定义两个私有属性:NSTimeInterval lastTimestampBOOL isInView
  • 覆盖hitTest:withEvent:。如果调用超级收益viewToWatch,请将lastTimestamp设置为事件的标记,将isInView设置为YES。否则,如果super返回导航栏,如果事件的标记匹配且isInView仍为YES,请重置这两个属性并返回viewToWatch

到目前为止一切正常。