2015-09-28 9 views
6

Qualcuno ha capito come ottenere eventi di movimento che funzionano con il nuovo telecomando Apple TV? Grazie.Come ottenere eventi di movimento con il telecomando Apple TV

Ho provato a chiamare

override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) { 
    super.motionBegan(motion, withEvent: event) 
    print("motion!") 
} 
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) { 
    super.motionEnded(motion, withEvent: event) 
    print("motion ended!") 
} 

Con e senza chiamare super-mi dà niente.

+0

Hai ricevuto un kit di sviluppo fisico o stai usando il simulatore? –

+2

Il kit fisico – CodyMace

+0

Ecco un articolo dal forum degli sviluppatori di app su questo: https://forums.developer.apple.com/thread/18861 – Stefan

risposta

4

Un grande esempio rapida può essere trovato qui: https://forums.developer.apple.com/message/65560#65560 Si è fondamentalmente ciò che ha detto Daniel Tempesta sopra, ma seguendo questo ottenuto lavorando per me. Ecco cosa ho fatto.

In AppDelegate:

var motionDelegate: ReactToMotionEvents? = nil 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     let center = NSNotificationCenter.defaultCenter() 
     center.addObserver(self, selector: "setupControllers:", name: GCControllerDidConnectNotification, object: nil) 
     center.addObserver(self, selector: "setupControllers:", name: GCControllerDidDisconnectNotification, object: nil) 
     GCController.startWirelessControllerDiscoveryWithCompletionHandler {() -> Void in 

     } 
     return true 
    } 

    func setupControllers(notif: NSNotification) { 
     print("controller connection") 
     let controllers = GCController.controllers() 
     for controller in controllers { 
      controller.motion?.valueChangedHandler = { (motion: GCMotion)->() in 
       if let delegate = self.motionDelegate { 
        delegate.motionUpdate(motion) 
       } 
      } 
     } 
    } 

protocol ReactToMotionEvents { 
    func motionUpdate(motion: GCMotion) -> Void 
} 

dove voglio implementato, nel mio caso uno SKScene:

import SpriteKit 
import GameController 
class GameScene: SKScene, ReactToMotionEvents { 

    override func didMoveToView(view: SKView) { 
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     appDelegate.motionDelegate = self 

    } 

    func motionUpdate(motion: GCMotion) { 
     print("x: \(motion.userAcceleration.x) y: \(motion.userAcceleration.y)") 
    } 
} 
2

Via How to access motion & orientation information of remote:


Prima di tutto, si ha la necessità di utilizzare NSNotificationCenter per trovare i controllori. Probabilmente la cosa migliore è farlo all'avvio dell'app. Qualcosa di simile:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controllerDidConnect:) name:GCControllerDidConnectNotification object:nil]; 

Possiamo quindi utilizzare il seguente codice dopo il collegamento per memorizzare le informazioni dispositivo in una proprietà:

- (void)controllerDidConnect:(NSNotification *)notification { 
    self.myController = notification.object; 
} 

Il profilo remoto è una sottoclasse del profilo micro gamepad. Motion e altri dati possono essere monitorati con l'aggiunta di un valore cambiato gestore di eventi:

GCMicroGamepad *profile = self.myController.microGamepad 
    profile.valueChangedHandler=^(GCMicroGamepad *gamepad, GCControllerElement *element) { 
     if (self.myController.motion) { 
      NSLog(@"motion supported"); 
      NSLog(@"gravity: %f %f %f", self.myController.motion.gravity.x, self.myController.motion.gravity.y, self.myController.motion.gravity.z); 
      NSLog(@"userAcc: %f %f %f", self.myController.motion.userAcceleration.x, self.myController.motion.userAcceleration.y, self.myController.motion.userAcceleration.z); 
      NSLog(@"rotationRate: %f %f %f", self.myController.motion.rotationRate.x, self.myController.motion.rotationRate.y, self.myController.motion.rotationRate.z); 
      NSLog(@"attitude: %f %f %f %f", self.myController.motion.attitude.x, self.myController.motion.attitude.y, self.myController.motion.attitude.z, self.myController.motion.attitude.w); 
     } 
    }; 

+0

Grazie, qualche idea su come scrivere l'ultimo passaggio in Swift? Inoltre, suggeriresti di configurarlo nell'appDelegate e quindi in tutta la mia app per ottenere i dati da lì? – CodyMace

+0

Sto provando questo su tvos 9.1 e ricevendo solo gli aggiornamenti di movimento per 'self.myController.motion.valueChangedHandler' – JakubKnejzlik

1

pensato che avrei aggiornare grande risposta di CodyMace con Swift 4.0 sintassi

In AppDelegate (Dovrai anche importare GameController qui):

var motionDelegate: ReactToMotionEvents? = nil 


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 
    let center = NotificationCenter.default 
    center.addObserver(self, selector: #selector(setupControllers), name: NSNotification.Name.GCControllerDidConnect, object: nil) 
    center.addObserver(self, selector: #selector(setupControllers), name: NSNotification.Name.GCControllerDidDisconnect, object: nil) 
    GCController.startWirelessControllerDiscovery {() -> Void in 

    } 
    return true 
} 

@objc func setupControllers(notif: NSNotification) { 
    print("controller connection") 
    let controllers = GCController.controllers() 
    for controller in controllers { 
     controller.motion?.valueChangedHandler = { (motion: GCMotion)->() in 
      if let delegate = self.motionDelegate { 
       delegate.motionUpdate(motion: motion) 
      } 
     } 
    } 
} 

Il protocollo rimane lo stesso

protocol ReactToMotionEvents { 
func motionUpdate(motion: GCMotion) -> Void 

}

e dove si vuole attuare

import SpriteKit 
import GameController 
class GameScene: SKScene, ReactToMotionEvents { 

    override func didMoveToView(view: SKView) { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     appDelegate.motionDelegate = self 

    } 

    func motionUpdate(motion: GCMotion) { 
     print("x: \(motion.userAcceleration.x) y: \(motion.userAcceleration.y)") 
    } 
} 
Problemi correlati