我有一个容器视图控制器,管理其自己的全屏内容视图,并附有多个手势识别器。子视图控制器可以覆盖部分屏幕;其根视图是提供不透明背景颜色的UIView,被一个UIScrollView覆盖,后者包含一个复杂的视图层次结构,包括堆叠视图等等。
在子级中滚动工作正确,以及与其子视图的任何用户交互。我遇到的问题是,滚动视图本身上的任何点按或其他非滚动手势(即不在其任何子视图内)都通过其后面的空UIView滑落,意外地由父(容器)控制器的根视图的手势识别器处理。 我希望这些触摸事件被子级的背景视图吞噬,以便它们被忽略/取消。
我的第一个想法是,在子VC上重写nextResponder,返回nil,假设这将防止触摸事件传递到superview。但没有成功,所以我尝试在子控制器上重写touch handling方法(touchesBegan:等)。但他们从未被调用。 然后我替换了一个简单的UIView子类来成为我的子控制器的根视图,同样地,在那里尝试了这两种方法。 再次返回nil以获取nextResponder没有效果,并且触摸方法从未被调用。
我的响应者链看起来设置得正好如我所期望的那样:滚动视图 -> 子VC的根视图 -> 子VC -> 父级的根视图 -> 父VC。这使我认为我的控制器容器设置正确,并让我怀疑父级根视图上的手势识别器在某种我不理解的方式上胜出响应者链。
这似乎应该很容易解决,我错过了什么吗?谢谢!
在子级中滚动工作正确,以及与其子视图的任何用户交互。我遇到的问题是,滚动视图本身上的任何点按或其他非滚动手势(即不在其任何子视图内)都通过其后面的空UIView滑落,意外地由父(容器)控制器的根视图的手势识别器处理。 我希望这些触摸事件被子级的背景视图吞噬,以便它们被忽略/取消。
我的第一个想法是,在子VC上重写nextResponder,返回nil,假设这将防止触摸事件传递到superview。但没有成功,所以我尝试在子控制器上重写touch handling方法(touchesBegan:等)。但他们从未被调用。 然后我替换了一个简单的UIView子类来成为我的子控制器的根视图,同样地,在那里尝试了这两种方法。 再次返回nil以获取nextResponder没有效果,并且触摸方法从未被调用。
我的响应者链看起来设置得正好如我所期望的那样:滚动视图 -> 子VC的根视图 -> 子VC -> 父级的根视图 -> 父VC。这使我认为我的控制器容器设置正确,并让我怀疑父级根视图上的手势识别器在某种我不理解的方式上胜出响应者链。
这似乎应该很容易解决,我错过了什么吗?谢谢!
touchesBegan
方法捕获(即该视图的根视图),而是直接进入了其父视图的手势识别器。这就是我感到困惑的地方。我想我可以根据需要禁用那些识别器,但我真的想理解这个问题。 - 4bar