2015-09-19 9 views
5

Sto cercando di rispondere a una stampa in una sottoclasse di SKScene. Posso ignorare il risponditore premendo Ended all'interno del mio ViewController bene, ma quando sposto la mia pressione su Ended Override nella mia sotto classe SKScene non ricevo più alcuna chiamata.tvOS I gesti UIPress non vengono riconosciuti nella sottoclasse di SKScene

Qui di seguito è la mia esclusione pressesEnabled, che funziona come previsto all'interno di ViewController

override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
    print("press") 
} 

Qualcuno sa come ricevere pressione di un tasto all'interno di una SKScene?

+0

è il primo risponditore SKScene? – jtbandes

+0

Non lo è, ma potrebbe valere la pena notare che tutti gli eventi tattili vengono colpiti. –

+0

Funziona se lo si rende primo risponditore? Puoi impostare un punto di interruzione all'interno dei gestori di eventi touch per vedere la traccia dello stack/come vengono inoltrati alla scena? – jtbandes

risposta

7

È necessario inoltrare i vostri eventi comunicati dalla ViewController al SKScene, in questo modo ...

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
    gameScene.pressesBegan(presses, withEvent: event) 
} 

override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
    gameScene.pressesEnded(presses, withEvent: event) 
} 

Poi nel gameScene (SKScene) fare qualcosa di simile:

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
    for press in presses { 
    switch press.type { 
    case .UpArrow: 
     print("Up Arrow") 
    case .DownArrow: 
     print("Down arrow") 
    case .LeftArrow: 
     print("Left arrow") 
    case .RightArrow: 
     print("Right arrow") 
    case .Select: 
     print("Select") 
    case .Menu: 
     print("Menu") 
    case .PlayPause: 
     print("Play/Pause") 
    } 
    } 
} 

override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
    print("Presses Ended.") 
} 

La "Freccia "le presse vengono inviate quando l'utente tocca i bordi del touchpad, ma non vengono riconosciuti nel simulatore. "Seleziona" viene inviato quando si tocca il centro del touchpad.

Spero che questo aiuti!

+0

Questo è quello che finirò per fare per il momento, ma se le funzioni associate alle presse sono contenute all'interno della super classe SKScene, allora non è un'indicazione che le funzioni associate vengono utilizzate da qualche parte all'interno di tvOS? –

1

Usa pressesBegan per mappare un pulsante fisico (Menu, PlayPausa), e pressesBegan o pressesEnded per il trackpad di Apple TV Remote (sinistra, destra, ecc). Se si preme su un "pulsante" del trackpad e si sposta in un'altra posizione e si rilascia, il metodo pressesEnded non viene chiamato, non è possibile farlo con un pulsante fisico.

Presse cominciò:

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
     print("Press began") 
     for item in presses { 
      if item.type == .PlayPause { 
        print("PlayPause") 
      } 
     } 
} 

Presse terminata:

override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) { 
     print("Press Ended") 
     for item in presses { 
      if item.type == .RightArrow { 
       print("Right Arrow") 
      } 
     } 
    } 
Problemi correlati