Я использую 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;
}
})
}