UIView上面展示了SKScene - 为什么触摸总是经历现场?
问题描述:
我有一个令人困惑的情况。首先,这里是代码:UIView上面展示了SKScene - 为什么触摸总是经历现场?
class MyView: SKView {
...
public override func awakeFromNib() {
super.awakeFromNib()
let gameScene = MyGameScene(...)
// ...
presentScene(gameScene)
let view = UIView()
view.frame = bounds
view.isUserInteractionEnabled = true
addSubview(view)
}
...
}
class MyGameScene: SKScene {
...
public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch received")
}
...
}
我有一个SKView
多数民众赞成呈现SKScene
。提交后,我添加一个填满屏幕的UIView
。但是,当我启动应用程序并点击屏幕时,会打印出“touch received”(触摸已收到),这表示触摸已到达现场,应位于view
的后面。这是为什么?
我能做些什么来防止它?
我也尝试添加一个手势识别器的视图。尽管(尽管我将cancelsTouchesInView
设置为true),但并不能防止这个问题。
感谢您的帮助。
答
似乎你正试图实现某种HUD。 SceneKit不是纯粹的UIKit所以你需要去适应你的方法 - 一些想法:
- 这里提到
UIButton
应该仍然工作: added button to sceneKit view but it has a lag - 双击手势识别器连接到
SCNView
: https://stackoverflow.com/a/42982177/5329717 - 如果你真的需要这个特殊的
UIView
你可以把它作为一个图像渲染,并使用SKSpriteNode
与SKTexture
并在那里处理触摸。 - 并不推荐,但作为最后的手段,你可以添加你
UIView
直接UIWindow
答
如果添加视图到SKView
的上海华你的问题得到解决(即把它添加到呈现视图控制器)。
所以,你可以尝试沿着这些路线做的事情:
let view = UIView()
view.frame = bounds
view.isUserInteractionEnabled = true
superview?.addSubview(view)
另外,您可以将它添加到窗口,但是这并不推荐使用。
+0
这会改变坐标系,'view.frame = bounds'不起作用。你必须在坐标系之间转换,如果它变得复杂,可能会变得混乱。此外,这不像是一种解决方案,它只是一种避免此问题的解决方法:/ – Quantm
尝试'view.isUserInteractionEnabled = false',它应该使GameScene SKView不接受触摸 –
我知道'isUserInteractionEnabled'就是这样的。我*要*想要接受接触。如果你的意思是在'MyGameScene'上禁用这个,那不是一个选项。 'SKView'应该能够触摸并且不会将其重定向到场景 – Quantm
您可以添加'presentSene()' – murphguy