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),但并不能防止这个问题。

感谢您的帮助。

+0

尝试'view.isUserInteractionEnabled = false',它应该使GameScene SKView不接受触摸 –

+0

我知道'isUserInteractionEnabled'就是这样的。我*要*想要接受接触。如果你的意思是在'MyGameScene'上禁用这个,那不是一个选项。 'SKView'应该能够触摸并且不会将其重定向到场景 – Quantm

+0

您可以添加'presentSene()' – murphguy

似乎你正试图实现某种HUD。 SceneKit不是纯粹的UIKit所以你需要去适应你的方法 - 一些想法:

+0

感谢您的输入。然而,我知道这方面的解决方法,但它让我感到困惑,因为它不是我认为它应该工作的方式(它可能有一个原因,我想知道)。对于像响应者链这样看似微不足道的东西的“解决方案”来说,这并不合适。 – Quantm

+0

是父视图框内的视图吗?它不会得到触摸事件。 –

+0

是的,它是在父母的框架 – Quantm

如果添加视图到SKView的上海华你的问题得到解决(即把它添加到呈现视图控制器)。

所以,你可以尝试沿着这些路线做的事情:

let view = UIView() 
view.frame = bounds 
view.isUserInteractionEnabled = true 
superview?.addSubview(view) 

另外,您可以将它添加到窗口,但是这并不推荐使用。

+0

这会改变坐标系,'view.frame = bounds'不起作用。你必须在坐标系之间转换,如果它变得复杂,可能会变得混乱。此外,这不像是一种解决方案,它只是一种避免此问题的解决方法:/ – Quantm