好吧,我只是浪费了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层而不是最深的?
答案 0 :(得分:1)
根据our chat,我们发现了实际发生的情况。
基本上,为了检测触摸,您正在迭代视图控制器中的所有子视图,并在每个hitTest
上执行presentationLayer
以检测动画期间的触摸 < / em>的
我们发现了一些问题:
hitTest
正在返回当前子视图(x
)图层的子图层,并且在不知不觉中与另一个视图(y
)混淆。for
循环在找到目标后未使用break
语句,从而导致上述1
混淆。addSubview
和subviews
的结构方式,视图会被反复搜索。<强>解决方案强>
最终解决方案来自于解决这些问题:
for x in self.view.subviews.reverse()
hitTest
返回的图层是否为子图层
正在测试的当前视图(伪代码)if
layerThatWasHit.superlayer == x.presentationLayer()
break
内添加if
语句
检测到终止for
循环并阻止多次执行
导致轻击其中一个动画视图的代码。