2015-09-28 5 views
6

Hat jemand herausgefunden, wie Bewegungsereignisse mit der neuen Apple TV-Fernbedienung funktionieren? Vielen Dank.Wie bekomme ich Bewegungsereignisse mit der Apple TV-Fernbedienung?

Ich habe versucht

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!") 
} 

Mit Aufruf und ohne Super Aufruf gibt mir nichts.

+0

Haben Sie eine physische dev-Kit erhalten oder verwenden Sie den Simulator? –

+2

Das physische Kit – CodyMace

+0

Hier ist ein Artikel aus dem App Developer Forum zu diesem Thema: https://forums.developer.apple.com/thread/18861 – Stefan

Antwort

4

Ein großer swift Beispiel kann hier gefunden werden: Bewegung und andere Daten können durch Hinzufügen eines Wertes geändert Ereignishandler verfolgt werden https://forums.developer.apple.com/message/65560#65560 Es ist im Grunde, was Daniel Sturm sagte oben, aber im Anschluss an diese habe es für mich arbeiten. Hier ist was ich getan habe.

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 
} 

Wo ich es umgesetzt wollen, in meinem Fall ein 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:


Zunächst einmal muss man NSNotificationCenter verwenden, um die Steuerungen zu finden. Wahrscheinlich am besten, wenn die App startet. Etwas wie folgt aus:

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

Wir können dann den folgenden Code nach dem Anschließen des Geräts Info in einer Eigenschaft zu speichern:

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

Das Remote-Profil eine Unterklasse der Mikro Gamepad Profil ist.

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

Vielen Dank, jede Idee, wie Sie den letzten Schritt in Swift obwohl schreiben? Würden Sie auch vorschlagen, es in der AppDelegate einzurichten und dann in meiner App nur die Daten von dort zu bekommen? – CodyMace

+0

Ich versuche das auf tvos 9.1 und erhalte nur Bewegungsupdates für 'self.myController.motion.valueChangedHandler' – JakubKnejzlik

1

Thought I CodyMace die große Antwort mit Swift 4.0 Syntax aktualisieren würde

In AppDelegate (Sie müssen GameController auch hier importieren):

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) 
      } 
     } 
    } 
} 

Das Protokoll bleibt gleich

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

}

Und wo Sie implementiert werden sollen

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)") 
    } 
}