【发布时间】:2020-01-21 11:39:40
【问题描述】:
我有一个红色的SCNNode,它以 1/2 的方式悬停在蓝色的 SCNNode 上。我需要他们两个的dragEvent,所以当他们被刷过时,他们会移动(效果很好)。问题是我只需要蓝色节点的 tapEvent。
如果点击了红色节点,我尝试按照answer here 到return nil,以便它可以继续到蓝色节点。它无法返回 nil,因为没有返回值:Unexpected non-void return value in void function。
if hitResult.node.name == "Red" {
return nil // Unexpected non-void return value in void function
}
if hitResult.node.name == "Blue" {
// do something
}
如何在点击红色节点时忽略触摸事件,并将触摸事件继续到其下方的蓝色节点?
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(nodeWasTapped(_:)))
sceneView.addGestureRecognizer(tapGesture)
func nodeWasTapped(_ recognizer: UITapGestureRecognizer) {
guard let sceneView = recognizer.view as? ARSCNView else { return }
let touchLocation: CGPoint = recognizer.location(in: sceneView)
let hitResults = sceneView.hitTest(touchLocation, options: [:])
if !hitResults.isEmpty {
guard let hitResult = hitResults.first else { return }
if hitResult.node.name == "Red" {
// *** ignore this tap and continue to the blue node ***
}
if hitResult.node.name == "Blue" {
// do something
}
}
}
【问题讨论】:
-
您是否尝试过删除
if hitResult.node.name == "Red" {}并查看是否执行了另一个 if 语句? -
是的,没有红色语句,蓝色语句工作正常,但有红色语句,红色节点下方的蓝色节点的 1/2 无法接收点击
-
也许您可以使用触摸位置来查看节点被点击的确切位置。就像,如果点击红色节点的下半部分,则忽略第一个 if 语句。
-
这就是问题所在。如何忽略红色的下半部分并让它将触摸事件传递给蓝色节点?在我添加的链接中,返回 nil 是让触摸事件传递到它下面的任何东西的原因。例如,为红色返回 nil 会让蓝色节点接收到点击。问题是我不能返回 nil
-
是的,你说得对,返回值在这里不起作用。你可以做的是get the coordinates of the red node,然后使用一些数学将这些坐标与
touchLocation的x 和y 值进行比较。如果点击红色节点的下半部分,则忽略红色 if 语句。否则,执行红色 if 语句。
标签: ios swift uitapgesturerecognizer