如何使用 HitTest 获得最前面的层而不是最深层

Posted

技术标签:

【中文标题】如何使用 HitTest 获得最前面的层而不是最深层【英文标题】:How does one get the front-most layer instead of the deepest layer using HitTest 【发布时间】:2015-10-12 00:10:38 【问题描述】:

好吧,我只是浪费了 2 天时间。 最简单的例子:我有 2 个 UIView 从屏幕顶部到底部被动画。经过大量研究后,我发现当 UIView 被动画化时,你可以“触摸/触发”触摸事件的唯一方法是通过 HitTest 使用 PresentationLayer 属性。

touchBegan 方法内部

    x as! UIView

   if x.layer.presentationLayer()!.hitTest(touchlocation) != nil 
    x.alpha = 0
    //Layer touched
    

情况: 在动画期间,第一个 UIView 与第二个 UIView 重叠。那时我正在“触摸”最顶层的 UIView。问题: HitTest 返回最低\最深的层,因此底部的 UIView 层将是可识别的层。问题:如何获得第一个/最前面的 UIView 层而不是最深的层?

【问题讨论】:

您能在这种情况下描述变量x 吗? x 是包含 UIViewControllerview 还是 x 代表正在动画的视图? x 是动画视图。你有 UIView X 和 UIView Y。两者都是动画的(UIVIew.animationDuration 等)。动画时 X 高于 Y。这意味着 X 在顶部,而 Y 在他后面。我正在单击顶部的 UIView - X。在 TouchBegan 方法中(如上所述)我试图使用 hitTest 检测触摸。 HitTest 触发给定位置的最深层 - 这意味着 UIView Y 正在被识别而不是 X。我如何获得最高动画 UIVIew X 的识别? @ThuggishNuggets 根据hitTest Documentation,只有当代表视图y 的层之一是x.sublayers 集合/数组的成员时,它才应该表现出您描述的行为,因为hitTest 遍历从接收器开始的层层次结构。如果xy具有公共超层的兄弟,除非动画以某种方式与其层的层次结构发生冲突,否则这是不可能的。 @ThuggishNuggets 嗯,就像我想的那样。所以如果另一个动画 UIView x/y 都崩溃了,就没有办法检测动画 UIView 上的触摸? 在 touchBegan 中添加断点并检查 x.presentationLayer().superlayery.presentationLayer().superlayer 是否是同一个图层实例。如果它们是真正的兄弟层,我认为它们应该具有相同的超级层。 【参考方案1】:

根据our chat,我们发现了实际情况。

基本上,为了检测触摸,您遍历视图控制器中的所有子视图,并在它们的每个 presentationLayers 上执行 hitTest 以检测触摸在动画期间

我们发现了一些问题:

    hitTest 正在返回当前子视图 (x) 层的子层,并在不知不觉中与另一个视图 (y) 混为一谈。 用于迭代子视图的for 循环在找到目标后没有使用break 语句,导致上述1 出现混乱。 通过按正常顺序迭代子视图,由于 addSubviewsubviews 的结构方式,这些视图被从后到前搜索。

解决方案

最终解决方案是通过以下方式解决这些问题:

使用for x in self.view.subviews.reverse() 以相反的顺序迭代子视图 测试hitTest返回的层是否是 当前正在测试的视图(伪代码)if layerThatWasHit.superlayer == x.presentationLayer() 在视图命中的if 内添加break 语句 检测到终止for 循环并防止多次执行 导致点击其中一个动画视图的代码。

【讨论】:

完美。太完美了,谢谢哥们!

以上是关于如何使用 HitTest 获得最前面的层而不是最深层的主要内容,如果未能解决你的问题,请参考以下文章

为啥不使用 Flatten 后跟 Dense 层而不是 TimeDistributed?

将授权放在服务层而不是 Web API 层

使用 WCF/OData 作为访问层而不是直接使用 EF/L2S/nHibernate 的论点

在数据层而不是单层应用程序中进行审计

如何在不挤压背景图像的情况下扩展 UIButton 的 hitTest 区域?

如何获得高度等于2/3可用空间的布局