Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CMDeviceMotion为磁场返回0值_Ios_Objective C_Swift_Ipad_Magnetometer - Fatal编程技术网

Ios CMDeviceMotion为磁场返回0值

Ios CMDeviceMotion为磁场返回0值,ios,objective-c,swift,ipad,magnetometer,Ios,Objective C,Swift,Ipad,Magnetometer,我正在开发具有指南针功能的iOS应用程序。我曾尝试使用CMMagnetometerData更新,这些更新会给出未经校准但正常的结果 之后,我尝试获得CMDeviceMotion更新,结果显示,该更新始终提供零磁场,且cmMagneticFieldCalibration准确度未校准。我唯一的设备是iPad,所以不能在其他设备上测试 可能是因为传感器未校准,所以字段为零,但我找不到任何执行校准的方法 如何解决这个问题 更新: ... motionManager.deviceMotionUpdateI

我正在开发具有指南针功能的iOS应用程序。我曾尝试使用
CMMagnetometerData
更新,这些更新会给出未经校准但正常的结果

之后,我尝试获得
CMDeviceMotion
更新,结果显示,该更新始终提供零磁场,且
cmMagneticFieldCalibration准确度未校准。我唯一的设备是iPad,所以不能在其他设备上测试

可能是因为传感器未校准,所以字段为零,但我找不到任何执行校准的方法

如何解决这个问题

更新:

...
motionManager.deviceMotionUpdateInterval = 0.05
motionManager.showsDeviceMovementDisplay = true 
motionManager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrame.XArbitraryCorrectedZVertical, toQueue: NSOperationQueue.mainQueue(), withHandler:handleUpdate)
...
private func handleUpdate(data: CMDeviceMotion!, error: NSError!) {
    if data != nil {
        let field = data.magneticField.field
        println("\(field.x), \(field.y), \(field.z)")
    }
}
建议使用
startDeviceMotionUpdatesSusingReferenceFrame:toQueue:withHandler:
,但它对我不起作用

建议将
showsDeviceMovementDisplay
设置为
true
。然而,它也没有工作,校准窗口只是没有弹出

最后,解决了。根据我的观察:

1) 使用
startDeviceMotionUpdatesSusingReferenceFrame:toQueue:withHandler:
referenceFrame
不等于
allzero
XArbitraryZVertical

2) 将
showsDeviceMovementDisplay
设置为
true

使用精度
CMMagneticFieldCalibration AccuracYunCalibrated
进行少量零值更新后,它将正常化

代码:

...
motionManager.deviceMotionUpdateInterval = 0.05
motionManager.showsDeviceMovementDisplay = true 
motionManager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrame.XArbitraryCorrectedZVertical, toQueue: NSOperationQueue.mainQueue(), withHandler:handleUpdate)
...
private func handleUpdate(data: CMDeviceMotion!, error: NSError!) {
    if data != nil {
        let field = data.magneticField.field
        println("\(field.x), \(field.y), \(field.z)")
    }
}

最后,根据我自己的观察:

1) 使用
startDeviceMotionUpdatesSusingReferenceFrame:toQueue:withHandler:
referenceFrame
不等于
allzero
XArbitraryZVertical

2) 将
showsDeviceMovementDisplay
设置为
true


经过几次精度为
CMMagneticFieldCalibration准确度未校准的零值更新后,它将正常化。

请分享您的代码,以回答您自己的问题。真的帮了我的忙!