用VC包含中的UINavigationController点击区域问题

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

问题是导航栏似乎拦截button的底部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向上和向下animation导航。 当它启动时,点击“button”底部的10点左右什么也不做。 我尝试覆盖touchesBegan我的自定义“button”视图,甚至没有被调用。

如果我为子VC使用常规的UIViewController (或其子类),button将按照预期进行响应。

这已经被问及在这里回答。 基本上,iOS上的控件具有“slop区域”,旨在允许用户方面精确的触摸。 我要提出一个关于这不应该超出控件的视图控制器边界的错误。

更新:作为雷达19504573提交。

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

  • 子类UIView并添加一个属性viewToWatch
  • 在我的主视图控制器的笔尖/故事板,视图类设置为我的子视图。
  • 在我的主视图控制器的viewDidLoad ,抓取视图,进行转换,并将其viewToWatch设置为触摸事件正在被viewToWatch的视图。
  • 在自定义视图中,定义两个私有属性: NSTimeInterval lastTimestampBOOL isInView
  • 覆盖hitTest:withEvent: 如果调用超级产量viewToWatch ,则将lastTimestamp设置为事件的标记,并将isInViewYES 。 否则,如果super返回一个导航栏,如果事件的标记匹配并且isInView仍然YES ,则重置这两个属性并返回viewToWatch

这工作到目前为止。