2015-09-28 1 views
6

Est-ce que quelqu'un a compris comment faire fonctionner les événements de mouvement avec la nouvelle télécommande Apple TV? Merci.Comment obtenir des événements de mouvement avec la télécommande Apple TV

J'ai essayé d'appeler

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

Avec et sans appel à super ne me donne rien.

+0

Avez-vous reçu un kit de développement physique ou utilisez-vous le simulateur? –

+2

Le kit physique – CodyMace

+0

Voici un article du forum des développeurs d'applications à ce sujet: https://forums.developer.apple.com/thread/18861 – Stefan

Répondre

4

Un grand exemple rapide se trouvent ici: https://forums.developer.apple.com/message/65560#65560 Il est essentiellement ce que Daniel Tempête dit ci-dessus, mais après cela a elle travaillant pour moi. Voici ce que j'ai fait.

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

Là où je veux en œuvre, dans mon cas un 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:


Tout d'abord, il faut utiliser NSNotificationCenter pour trouver les contrôleurs. Probablement préférable de le faire lorsque l'application se lance. Quelque chose comme ceci:

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

On peut alors utiliser le code suivant après la connexion à stocker les informations de l'appareil dans une propriété:

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

Le profil à distance est une sous-classe du profil micro gamepad. Motion et d'autres données peuvent être suivies par l'ajout d'un gestionnaire d'événements changé de valeur:

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

Merci, vous savez comment écrire cette dernière étape dans Swift? En outre, suggérez-vous de le configurer dans appDelegate, et ensuite tout au long de mon application pour obtenir les données à partir de là? – CodyMace

+0

J'essaie ceci sur tvos 9.1 et ne recevant que des mises à jour de mouvement pour 'self.myController.motion.valueChangedHandler' – JakubKnejzlik

1

Je pensais que je voudrais mettre à jour une grande réponse avec Swift 4.0 syntaxe CodyMace

En appDelegate (Vous devrez également importer GameController ici):

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

Le protocole reste le même

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

}

et où vous voulez mis en œuvre

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