指南针校准目标-c

时间:2013-06-13 14:06:15

标签: iphone ios objective-c map

我尝试在ios应用程序中使用指南针。我有一个问题。如果我实施 其中locationManagerShouldDisplayHeadingCalibration方法和return YES,然后始终显示校准显示。但我应该像苹果地图一样。即有时应显示校准显示。指南针应该校准。

5 个答案:

答案 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;标题。