我正在使用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/

10-13 09:52