我想要实现的基本上是同时呈现两个导航控制器(他们的视图应该是一个在另一个上)。如果触摸不在顶部导航控制器中显示的某个元素上(顶部导航控制器视图的子视图),我希望导航控制器的视图位于顶部以将触摸转发到下面的导航控制器。
我尝试了多种方法,但似乎都没有效果。最接近我得到的解决方案是在视图控制器的view
属性中使用以下方法。这适用于常规视图控制器,但我认为导航控制器有一些干扰它的子视图。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if (!self.forwardTouchesToSubviews) {
return NO;
}
BOOL pointInSubview = NO;
for (UIView *view in self.subviews) {
if (!view.isHidden && CGRectContainsPoint(view.frame, point)) {
CGPoint newPoint = [view convertPoint:point fromView:self];
pointInSubview = [view pointInside:newPoint withEvent:event];
if (pointInSubview) {
return YES;
}
}
}
return NO;
}
对于我的应用程序导航结构这种方式会简化导航逻辑很多,在我看来,在很多情况下这是非常灵活的解决方案,但我似乎无法使其工作。
修改
简单易懂。让我们说我有一个背景导航控制器(有一些很好的动画,形成应用程序的背景)。除此之外,还有各种各样的UI元素(控件,按钮,为应用程序提供功能的东西),它们不会覆盖整个屏幕,因此背景仍然可见。这些元素组成了多个屏幕(因此需要导航控制器)。此外,可能存在多个背景,这些背景独立于上面的UI元素而变化,因此需要导航控制器(这里可以使用一些其他控制器,但是假设我们为了示例使用导航控制器)。更复杂的是,触摸不包含UI元素的区域应该提供一些动画反馈(因此背景控制器)应该拦截上述UI元素未捕获的触摸。
我希望这能澄清我想要做的事情。