如何使用HitTest获取最前层而不是最深层

时间:2015-10-12 00:10:38

标签: ios swift uiview calayer hittest

好吧,我只是浪费了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层而不是最深的?

1 个答案:

答案 0 :(得分:1)

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

基本上,为了检测触摸,您正在迭代视图控制器中的所有子视图,并在每个hitTest上执行presentationLayer以检测动画期间的触摸 < / em>的

我们发现了一些问题:

  1. hitTest正在返回当前子视图(x)图层的子图层,并且在不知不觉中与另一个视图(y)混淆。
  2. 用于迭代子视图的for循环在找到目标后未使用break语句,从而导致上述1混淆。
  3. 通过按正常顺序迭代子视图,由于addSubviewsubviews的结构方式,视图会被反复搜索。
  4. <强>解决方案

    最终解决方案来自于解决这些问题:

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