用户位置Mapkit ViewDidLoad

时间:2014-03-23 17:09:59

标签: ios mapkit mkuserlocation

所以从我在这里看到的多个答案来看,这是如何在应用程序加载时居中和缩放用户位置,并且效果很好。

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    NSLog(@"Did update user location");
    MKCoordinateRegion mapRegion;
    mapRegion.center = mapView.userLocation.coordinate;
    mapRegion.span.latitudeDelta = 0.2;
    mapRegion.span.longitudeDelta = 0.2;

    [map setRegion:mapRegion animated: YES];

}

但是当你每次调用这个委托方法开始玩地图时,它会把我带回用户位置。如果我停止用户位置更新,我该如何处理?我试过把这个代码放在视图中加载,所以我得到初始缩放和中心,但它不起作用?或者也许我可以将代码放在另一个地图套件代理方法中,我只是不知道正确的代理方法。其他人如何做到这一点?

1 个答案:

答案 0 :(得分:2)

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{

每次用户的位置发生变化时,都会调用mapKit委托方法。这就是为什么您的地图会在每次通话时都以用户的位置为中心。您无法使用该功能,以便在应用启动时在用户的位置初始化地图。

我认为如果它没有在viewDidLoad上工作,那是因为那时应用还不知道用户的位置。在那里放一个断点,亲眼看看。

对我来说,你应该在应用获取用户位置数据时调用的viewDidLoad中添加一个观察者

// Check if user authorized use of location services
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) {
    // Add observer
    [self.mapView.userLocation addObserver:self
                                forKeyPath:@"location"
                                   options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                                   context:NULL];
}

然后在

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context;

等待keyPath" location"被叫。 当它第一次触发时,加载视图并且应用知道用户的位置。然后,您可以将代码置于用户位置的中心位置。 但是请确保删除观察者,这样它就不会多次接听电话。

[self.mapView.userLocation removeObserver:self
                                   forKeyPath:@"location" context:NULL];