Я использую CMMotionManger для получения показаний отклонения от курса с помощью следующего кода.
Независимо от ориентации 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;
}
})
}
Подробнее здесь: https://stackoverflow.com/questions/379 ... rientation