我正在使用CMMotionManger通过以下代码获取偏航读数。
无论UIInterfaceOrientation如何,我都试图在向右偏航90度时获得负1.5708 rad的读数,而在向左偏向90度时获得正1.5708 rad的读数(与极性无关,因为可以根据需要将其反转)。
当设备处于纵向时,我能够使其执行我想要的操作。以弧度计,当设备向右偏航90度时,它使我得到-1.5708左右,而向左旋转时给我约1.5708弧度。
但是,当设备以纵向倒置方向旋转时,当偏航向右旋转时,它会从-2.4左右下降到-3.14附近,然后从〜3.14下降到2.6。如何使它平滑且连续0到-1.5708 rad?
我还需要左右校正景观。
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;
}
})
}
最佳答案
事实证明,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
}
关于ios - 正确的CMMotionManager偏航当前UIInterfaceOrientation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37933299/