我尝试在ios应用程序中使用指南针。我有一个问题。如果我实施
其中locationManagerShouldDisplayHeadingCalibration
方法和return YES
,然后始终显示校准显示。但我应该像苹果地图一样。即有时应显示校准显示。指南针应该校准。
答案 0 :(得分:15)
好的,我不能发表评论所以我认为我应该留下回复,因为Claude Houle的回复对我有用。
我正在使用这个改进版的Claude Houle的response。
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
if(!manager.heading) return YES; // Got nothing, We can assume we got to calibrate.
else if(manager.heading.headingAccuracy < 0 ) return YES; // 0 means invalid heading, need to calibrate
else if(manager.heading.headingAccuracy > 5 ) return YES; // 5 degrees is a small value correct for my needs, too.
else return NO; // All is good. Compass is precise enough.
}
还想说出Claude Houle所说的几乎实现了API文档here,其中声明:
如果您在此代理中返回NO或不为其提供实施,则Core Location不会显示标题校准提醒。即使没有显示警报,当任何干扰磁场远离设备时,校准仍然可以自然发生。 但是,如果设备因任何原因无法校准自身,则任何后续事件的headingAccuracy属性中的值都将反映未校准的读数。
答案 1 :(得分:7)
我使用以下代码:
@property (nonatomic, retain) CLHeading * currentHeading; // Value updated by @selector(locationManager:didUpdateHeading:)
...
...
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
if( !self.currentHeading ) return YES; // Got nothing, We can assume we got to calibrate.
else if( self.currentHeading.headingAccuracy < 0 ) return YES; // 0 means invalid heading. we probably need to calibrate
else if( self.currentHeading.headingAccuracy > 5 )return YES; // 5 degrees is a small value correct for my needs. Tweak yours according to your needs.
else return NO; // All is good. Compass is precise enough.
}
答案 2 :(得分:4)
更直接的解决方案:
<强>目标C 强>
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
{
CLLocationDirection accuracy = [[manager heading] headingAccuracy];
return accuracy <= 0.0f || accuracy > 10.0f;
}
这利用了以下事实:在nil对象上执行的选择器总是返回零,并且精度永远不会有效并且等于0.0f(即100%准确)。
<强>夫特强>
由于引入了选项,最简单的Swift解决方案确实需要分支,看起来像:
func locationManagerShouldDisplayHeadingCalibration(manager: CLLocationManager) -> Bool {
if let h = manager.heading {
return h.headingAccuracy < 0 || h.headingAccuracy > 10
}
return true
}
请注意,我们正在查看headingAccuracy
,Apple的文档声明:
此属性中的正值表示潜在错误 在MagneticHeading属性报告的值和之间 磁北的实际方向。因此,这个值越低 财产,标题越准确。负值意味着 报告的标题无效,可在设备出现时发生 未经校准或受到局部磁场的强烈干扰 字段。
答案 3 :(得分:2)
manager.heading是CLHeading。这就是为什么manager.heading&gt; 5会发出警告。 self.currentHeading.headingAccuracy&gt; 5是真实的。
答案 4 :(得分:0)
在我的iPhone6上,headingAccuracy通常为25.0,因此只需返回YES并依靠iOS来确定何时显示校准屏幕似乎是最好的选择。 使用headingAccuracy&lt;丢弃读数0.0防止使用错误的&#39;标题。