2016-01-15 3 views
2

J'ai donc cherché à connaître Core Motion et j'ai du mal à trouver quelque chose qui le ramènerait à un niveau débutant. Il semble qu'il n'y en ait pas trop par rapport à d'autres sujets. Mon but: faire un UILabel afficher l'angle du téléphone est sur (je crois à propos de l'axe z), 0 degrés étant lorsque le téléphone est en paysage.Swift CMMotion - Affichage de l'angle du téléphone

J'ai vu this article from NSHipster qui, je pense, m'avait envoyé dans le bon état, donc j'ai essayé de recréer le code qui est vu dans le .gif in this article. Il maintient le UIImageView vertical pendant que le téléphone s'incline ... pas de chance. Je ne comprends tout simplement pas la plus grande image de la façon dont tous ces extraits de code fonctionnent ensemble, je suppose que c'est la première fois que je joue le Core Motion.

Ma question:

1) Quelqu'un pourrait-il recréer ce imageView mobile vu dans ce lien pour moi afin que je puisse étudier la façon dont tout cela fonctionne (de préférence l'ensemble du dossier de viewController.swift).

Ou mieux encore

2) Mettre un code ensemble qui afficherait quel angle le téléphone est assis. Faites-moi savoir si je peux être plus précis. Merci beaucoup!

MISE À JOUR: Eh bien, je me suis surprise et j'ai réussi à travailler dessus, puis je suis venue ici pour poster et TJ Shae vient de poster la réponse haha ​​... m'a beaucoup dérangé mais je suis en route maintenant.

import UIKit 
    import CoreMotion 

    class AngleGaugeViewController: UIViewController { 

@IBOutlet weak var rotX: UILabel! 
@IBOutlet weak var rotY: UILabel! 
@IBOutlet weak var rotZ: UILabel! 
@IBOutlet weak var theAngle: UILabel! 

@IBOutlet weak var imageView: UIImageView! 


let manager = CMMotionManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 


    manager.gyroUpdateInterval = 0.1 
    manager.accelerometerUpdateInterval = 0.1 

    manager.startGyroUpdates() 
    manager.startAccelerometerUpdates() 


    let queue = NSOperationQueue.mainQueue 
    manager.startGyroUpdatesToQueue(queue()) { 
     (data, error) in 
     // ... 
    } 



    if manager.deviceMotionAvailable { 
     manager.deviceMotionUpdateInterval = 0.01 
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { 
      [weak self] data, error in 

      let rotation = atan2(data!.gravity.x, data!.gravity.y) - M_PI 
      self?.imageView.transform = CGAffineTransformMakeRotation(CGFloat(rotation)) 
     } 
    } 




} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

Répondre

2

Eh bien, le code NSHipster a parfaitement fonctionné pour moi première fois:] Voici le code UIViewController:

import UIKit 
import CoreMotion 

class ViewController: UIViewController { 

@IBOutlet weak var imgView: UIImageView! 

let manager = CMMotionManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if manager.deviceMotionAvailable { 
     manager.deviceMotionUpdateInterval = 0.01 
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { 
      (data, error) in 
      if let data = data { 
       let rotation = atan2(data.gravity.x, data.gravity.y) - M_PI 
       self.imgView.transform = CGAffineTransformMakeRotation(CGFloat(rotation)) 
      } 
     } 
    } 
} 

} 
+0

Oui oui oui, ça a marché 1 minute avant que vous avez posté ça haha! merci tas pour l'entrée, c'est à peu près le même que je me suis retrouvé avec! – Steve

+0

@TJ Comment savoir si l'appareil pointe vers l'envers, vers la gauche, vers la droite ou vers le haut? –