2017-10-06 4 views
5

私は混乱する状況があります。まず、ここでのコードは次のとおりです。上記の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") 
    } 
    ... 
} 

私はSKSceneを提示していますSKViewを持っています。それを提示した後、私は画面いっぱいのUIViewを追加します。しかし、私がアプリを起動して画面をタップすると、「touch received」という文字が表示されます。これは、タッチがシーンに届いたことを意味します。viewの背後にある必要があります。何故ですか?

どうすれば防止できますか?

また、ジェスチャ認識機能をビューに追加しようとしました。ただし、問題を防ぐことはできません(cancelsTouchesInViewをtrueに設定しても)

ありがとうございました。

+0

GameScene SKViewが –

+0

のタッチを受け付けないようにするために 'view.isUserInteractionEnabled = false'を試してください。それは' isUserInteractionEnabled'が存在することです。私は触れることを受け入れるようにしたい。そしてこれを 'MyGameScene'で無効にすることを意味するならば、それはオプションではありません。 'SKView'はタッチを受け取り、シーンにリダイレクトしないでください – Quantm

+0

' presentSene() ' – murphguy

答えて

0

何らかの種類のHUDを実現しようとしているようです。あなたのアプローチを適応させる必要がありますので、SceneKitは純粋UIKitのではない - いくつかのアイデア:ここに述べたように

  • UIButtonはまだ動作するはずです:SCNViewに添付 added button to sceneKit view but it has a lag
  • タップジェスチャー認識器: https://stackoverflow.com/a/42982177/5329717
  • 場合この特別なものが本当に必要です。UIViewイメージとしてレンダリングしてSKSpriteNodeSKTextureを付けてそこに触れることができます。
  • は本当に推奨しないが、最後の手段として、あなたは追加することができ、あなたのUIView直接おSKViewのスーパーにビューを追加する場合はあなたの問題が解決されます
+0

あなたのご意見ありがとうございます。しかし、私はこれの回避策を知っていますが、それは私がそれがうまくいくと思われる方法ではないので(それは理由があり、それについて知りたいと思うので)私にはバグです。それはレスポンダーチェーンのような一見些細なことのための解決策を「ハックする」ことは正しいとは思わない。 – Quantm

+0

ビューは親のビューフレーム内にありますか?それはタッチイベントを取得しませんでした。 –

+0

はいそれは親のフレーム内にあります – Quantm

0

(すなわち提示ビューコントローラに追加UIWindowへ)。

ですから、これらの線に沿って何かをやって試すことができます:

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

別の方法としては、ウィンドウに追加することができますが、これは本当にお勧めではありません。

+0

これは座標系を変更し、 'view.frame = bounds'は動作しません。複雑になると乱雑になるかもしれない座標系の間で変換する必要があります。また、これは解決策のようには感じられませんが、問題を回避するための回避策に過ぎません。/ – Quantm

関連する問題