2016-06-20 7 views
0

Я использую CMMotionManger, чтобы получить показания рыскания с помощью следующего кода.Правильный контроль CMMotionManager для текущего UIInterfaceOrientation

Независимо от UIInterfaceOrientation, я пытаюсь получить показания минус 1,5708 рад, если рыскание на 90 градусов вправо и положительное 1.5708 рад, если устройство дергается на 90 градусов влево (не имеет отношения к полярности, поскольку при необходимости может быть отменено).

Я могу заставить его делать то, что я хочу, когда устройство находится в портретной ориентации. В радианах он дает мне около -1.5708, когда устройство дергается на 90 градусов вправо и около 1.5708 рад при вращении влево.

Но когда устройство находится в портретной ориентации вверх тормашками, когда рыскание вращается вправо, оно начинается с -2,4 до примерно -3,14, а затем переходит на уровень от 3,14 до 2,6. Как я могу сделать его гладким и непрерывным от 0 до -1.5708 рад?

Мне также нужно исправить пейзаж слева и справа.

if motionManager == nil { 
    motionManager = CMMotionManager() 
} 

let updateInterval: NSTimeInterval = 1/24.0 //24hz 

if (motionManager!.accelerometerAvailable) { 
    motionManager!.accelerometerUpdateInterval = updateInterval 

    motionManager!.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { (motion:CMDeviceMotion?, error: NSError?) -> Void in 

     print("\(motion!.attitude.yaw)") 

     switch (TDTDeviceUtilites.interfaceOrientation()) { 
      case UIInterfaceOrientation.Portrait: 
       // No correction needed 
       break; 

      case UIInterfaceOrientation.PortraitUpsideDown: 
       //need to apply correction 
       break; 

      case UIInterfaceOrientation.LandscapeRight: 
       //need to apply correction 
       break; 

      case UIInterfaceOrientation.LandscapeLeft: 
       //need to apply correction 
       break; 
     } 
    }) 
} 

ответ

0

Оказывается, CMMotionManager ориентируется на текущую UIInterfaceOrientation. Таким образом, самым простым решением является остановка и перезапуск CMMotionManager при вращении устройства. (Желаю, чтобы я знал это, это сэкономило бы мне много разочарований!) Например:

public override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 
    stopMotionUpdates() 
    motionManager = nil 
    startMotionUpdates() 
} 

func stopMotionUpdates() {    
    motionManager?.stopMagnetometerUpdates() 
    motionManager?.stopDeviceMotionUpdates() 
    motionManager?.stopAccelerometerUpdates() 
} 

func startMotionUpdates() { 
    //Start motion updates is the code in the question above 
}