用MKMapView显示当前用户位置?

时间:2012-03-29 11:42:54

标签: iphone ios mapkit

我正在尝试通过将MKMapView的属性设置为显示用户的当前位置,即setShowsUserLocationYES。默认情况下,当应用程序开始更新用户位置时,iPhone屏幕左上角会出现一个箭头。但是在显示当前位置后,箭头应该消失,但只要应用程序正在运行,它仍然存在,这意味着应用程序仍处于静止状态在后台更新位置?那我怎么能停止更新当前位置?我已经实现了立即调用的委托..

3 个答案:

答案 0 :(得分:16)

如果地图可见且showUserLocation设置为YES,则会在后台继续更新。

当视图消失或应用程序转到后台时,您需要取消设置。最好的方法可能是注册viewController以通知UIApplicationDidEnterBackgroundNotificationUIApplicationDidBecomeActiveNotification

- (void)viewDidLoad{
  [super viewDidLoad];
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appToBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appReturnsActive) name:UIApplicationDidBecomeActiveNotification object:nil];
} 

然后,在此通知调用的方法中,更改有关userLocation的地图视图属性:

- (void)appToBackground{
  [mapview setShowsUserLocation:NO];
}

并且

- (void)appReturnsActive{
  [mapview setShowsUserLocation:YES];
}

通过在那里设置断点并返回主屏幕,检查是否确实调用了这些方法。

答案 1 :(得分:1)

我同意Michael Kernahan,我很确定MKMapView内有竞争条件。

MKMapView似乎一旦意识到它失去了对位置服务的访问权限,就会尝试自行删除userLocationAnnotation(蓝点)。

但是,这似乎没有受到保护,如果开发人员也发出[mapView setShowsUserLocation:NO],很可能会因为MKMapView内部线程试图删除{{}}之间的竞争而崩溃{1}},以及正在调用userLocationAnnotation的线程。

答案 2 :(得分:0)

您可以通过向位置的经理[self.locationManager stopUpdatingLocation];

发送消息来停止更新位置

至于您的情况,您是否尝试停止显示用户位置?