【问题标题】:Tap region issues with UINavigationController in VC containmentVC 遏制中 UINavigationController 的点击区域问题
【发布时间】:2015-03-15 13:07:27
【问题描述】:

我有一个 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(或其子类),按钮会按预期响应。

【问题讨论】:

  • 当你给nav.view上色时,它不会和按钮重叠,是吗?

标签: ios uinavigationcontroller uicontainerview


【解决方案1】:

这已被问及回答here。基本上,iOS 上的控件具有“倾斜区域”,旨在允许用户进行随意的触摸准确性。我将提交一个关于这不应超出控件的视图控制器边界的错误。

更新:归档为雷达 19504573。

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

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

到目前为止它正在工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多