gpt4 book ai didi

ios - 防止 subview Controller 上未处理的触摸事件传递到容器 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:31:35 31 4
gpt4 key购买 nike

我有一个容器 View Controller 管理它自己的全屏内容 View ,并附有几个手势识别器。 subview Controller 可以覆盖在屏幕的一部分上;它的 Root View 是一个提供不透明背景颜色的 UIView,它被一个 UIScrollView 覆盖,而 UIScrollView 又包含堆栈 View 等的复杂 View 层次结构。

在 subview 中滚动工作正常,任何用户与其 subview 的交互也是如此。我遇到的问题是 ScrollView 本身(即不在其任何 subview 内)上的任何点击或其他非滚动手势都会穿过它后面的空 UIView 并且意外地被 Root View 上的手势识别器处理父(容器) Controller 。我希望这些触摸被 child 的背景 View 吞没,以便它们被忽略/取消。

我的第一个想法是覆盖子 VC 上的 nextResponder 以返回 nil,假设这会阻止触摸事件传递到父 View 。那里没有成功,所以我尝试覆盖子 Controller 上的触摸处理方法(touchesBegan: 等),但它们从未被调用过。然后我将一个简单的 UIView 子类替换为我的子 Controller 的 Root View ,同样尝试了这两种方法。再次为 nextResponder 返回 nil 无效,触摸方法永远不会被调用。

我的响应链看起来完全按照我的预期设置: ScrollView --> 子 VC 的 Root View --> 子 VC --> 父的 Root View --> 父 VC。这让我认为我的 Controller 包含设置正确,并让我怀疑父级 Root View 上的手势识别器以某种我不理解的方式在响应者链中胜出。

这看起来应该很容易。我错过了什么?谢谢!

最佳答案

多亏了this very helpful WWDC video,我想我能更好地理解这里发生了什么.

给定传入触摸,系统首先将该触摸与最深的 HitTest View 相关联;在我的例子中是 UIScrollView。然后它显然会回到 super View 的层次结构中寻找任何其他附加的识别器。文档的这个关键位暗示了这种行为:

A gesture recognizer operates on touches hit-tested to a specific view and all of that view’s subviews.

ScrollView 有自己的内部平移识别器,它可以取消未识别的触摸,或者可能回退到不会碰巧转发响应链的响应方法。这解释了为什么我的响应器方法永远不会被调用,即使我自己的识别器被禁用也是如此。

有了这些信息,我可以想出一些可能的方法来解决我的问题,例如:

  • 如果/当关联 View 在子 Controller 下时,使用手势委托(delegate)方法忽略触摸。
  • 编写一个捕获所有触摸并忽略它们的“空”手势识别器子类,并将其附加到子 Controller 的 Root View 。

但我最终做的只是用一个新的空 View 在顶部重新排列我的 View 层次结构,这样我的子 Controller View 就可以成为主内容 View 的兄弟,而不是它的 subview 。

因此 View 层次结构由此发生变化:

"Before" hierarchy

为此:

"After" hierarchy

这解决了我的问题:我的手势识别器不再与针对子 Controller View 进行 HitTest 的触摸进行交互。而且我认为它更好地捕捉了我的应用程序 Controller 之间的概念关系,而不需要任何额外的逻辑。

关于ios - 防止 subview Controller 上未处理的触摸事件传递到容器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46539898/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com