【发布时间】:2018-03-14 08:58:08
【问题描述】:
我有一个容器视图控制器来管理它自己的全屏内容视图,并附加了几个手势识别器。子视图控制器可以覆盖在屏幕的一部分上;它的根视图是一个提供不透明背景颜色的 UIView,它被一个 UIScrollView 覆盖,而 UIScrollView 又包含堆栈视图等复杂的视图层次结构。
在子视图中滚动以及任何用户与其子视图的交互都可以正常工作。我遇到的问题是滚动视图本身(即不在其任何子视图内)上的任何点击或其他非滚动手势都通过它后面的空 UIView 并由根视图上的手势识别器意外处理父(容器)控制器。我希望这些触摸被孩子的背景视图所吞噬,以便它们被忽略/取消。
我的第一个想法是在子 VC 上覆盖 nextResponder 以返回 nil,假设这会阻止触摸事件传递到父视图。那里没有成功,所以我尝试覆盖子控制器上的触摸处理方法(touchesBegan: 等),但它们从未被调用。然后我将一个简单的 UIView 子类替换为我的子控制器的根视图,同样在那里尝试了这两种方法。再次为 nextResponder 返回 nil 无效,并且 touch 方法永远不会被调用。
我的响应链看起来完全按照我的预期设置:滚动视图 --> 子 VC 的根视图 --> 子 VC --> 父根视图 --> 父 VC。这让我认为我的控制器包含设置正确,并让我怀疑父级根视图上的手势识别器以某种我不理解的方式战胜了响应者链。
这看起来应该很容易。我错过了什么?谢谢!
【问题讨论】:
-
图形表示你的东西会有帮助,或者演示项目:),或者几行代码
-
确保您“替换”为子控制器根视图的 UIView 已启用用户交互设置为 true
-
感谢@SandeepBhandari,我在使用普通 UIView 和使用我的子类时都启用了用户交互。我尝试关闭它(认为这可能是防止触摸沿着链向上传播所需要的),但这也会扼杀其所有子视图(我的滚动视图等)的用户交互。
-
@4bar :尝试实施 hitTest,正如我在我的回答中所发布的那样:) 那应该可以帮助你
-
@4bar :看起来很有趣。将密切关注这个问题:) 你不能简单地在命中测试中返回 nil 这就是为什么我添加了条件并调用 super.hitTest 但现在你说你的滚动视图覆盖了整个视图并且命中测试总是会成功删除我的答案
标签: ios uiviewcontroller uigesturerecognizer uitouch uiresponder