1

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

-(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];

}

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

4

1 回答 1

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“位置”被调用。当它第一次触发时,视图被加载并且应用程序知道用户的位置。然后,您可以将代码放在用户位置的地图中心。但是然后确保删除观察者,这样它就不会被调用超过一次。

[self.mapView.userLocation removeObserver:self
                                   forKeyPath:@"location" context:NULL];
于 2014-03-23T17:35:05.667 回答