如何在不干扰轨道功能的情况下将 UIPanGestureRecognizer 应用于场景?
How to apply a UIPanGestureRecognizer to a scene without disturbing the orbit function?
以我们在Xcode中新建一个Game类型的项目时生成的示例场景为例。它将显示一艘旋转的 space 飞船。该对象允许用户通过手指移动在所有方向上转动它。我在这里需要的是能够识别用户是否已经开始使用 3D 对象进行那种类型的移动。我使用以下代码将 UIPanGestureRecognizer 添加到场景视图中:
let panGesture = UIPanGestureRecognizer(target: self, action:
#selector(handlePan(_:))) scnView.addGestureRecognizer(panGesture)
@objc
func handlePan(_ gestureRecognize: UIGestureRecognizer) {
print("in handle Pan")
}
这在这方面起作用,当手指移动时,消息会出现在控制台中。但是现在的问题是 space 船不再对这种运动做出反应。合乎逻辑的,因为 UIPanGestureRecognizer 捕获了该事件。现在的问题是:怎样才能既保留3D模型的轨道功能,又得到平移手势的反应?
您可以在 SCNView
上使用 hit testing(命中测试实际上是 SCNSceneRenderer
的一部分)来确定手势的开始是否在您关心的任何节点上.您可以使用类别位掩码将其缩小到您关心的节点。
在手势识别器的委托方法中进行命中测试,可能gestureRecognizerShouldBegin
。 Return 如果触摸没有击中您关心的东西,则为 false。这应该允许您与节点交互,同时如果您没有触摸该节点则保持相机控制。
您还需要在委托中实现 shouldRecgonizeSimultaneouslyWith
,并且 return 为 true 以便仍然处理相机平移手势。
以我们在Xcode中新建一个Game类型的项目时生成的示例场景为例。它将显示一艘旋转的 space 飞船。该对象允许用户通过手指移动在所有方向上转动它。我在这里需要的是能够识别用户是否已经开始使用 3D 对象进行那种类型的移动。我使用以下代码将 UIPanGestureRecognizer 添加到场景视图中:
let panGesture = UIPanGestureRecognizer(target: self, action:
#selector(handlePan(_:))) scnView.addGestureRecognizer(panGesture)
@objc
func handlePan(_ gestureRecognize: UIGestureRecognizer) {
print("in handle Pan")
}
这在这方面起作用,当手指移动时,消息会出现在控制台中。但是现在的问题是 space 船不再对这种运动做出反应。合乎逻辑的,因为 UIPanGestureRecognizer 捕获了该事件。现在的问题是:怎样才能既保留3D模型的轨道功能,又得到平移手势的反应?
您可以在 SCNView
上使用 hit testing(命中测试实际上是 SCNSceneRenderer
的一部分)来确定手势的开始是否在您关心的任何节点上.您可以使用类别位掩码将其缩小到您关心的节点。
在手势识别器的委托方法中进行命中测试,可能gestureRecognizerShouldBegin
。 Return 如果触摸没有击中您关心的东西,则为 false。这应该允许您与节点交互,同时如果您没有触摸该节点则保持相机控制。
您还需要在委托中实现 shouldRecgonizeSimultaneouslyWith
,并且 return 为 true 以便仍然处理相机平移手势。