用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 lastTimestamp
和BOOL isInView
。 - 覆盖
hitTest:withEvent:
如果调用超级产量viewToWatch
,则将lastTimestamp
设置为事件的标记,并将isInView
为YES
。 否则,如果super
返回一个导航栏,如果事件的标记匹配并且isInView
仍然YES
,则重置这两个属性并返回viewToWatch
。
这工作到目前为止。