mapView不使用didUpdateUserLocation进行第二次尝试

时间:2011-06-02 11:11:33

标签: ios mkmapview android-mapview

当我从mainviewcontroller按下视图贴图按钮时,我正在加载mapviewcontroller:

- (IBAction)mapButton:(id)sender {
    MapKitDisplayViewController *mapKitDisplayView = [[MapKitDisplayViewController alloc] init];
    [self presentModalViewController:mapKitDisplayView animated:YES];   
    [mapKitDisplayView release]; mapKitDisplayView = nil;
}

在启动此地图视图时,会调用此方法,该方法会正确缩放到用户位置:

- (void)mapView:(MKMapView *)myMapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    myMapView.showsUserLocation = YES;
    NSLog(@"didUpdateUserLocation = '%@'", userLocation);

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([userLocation coordinate], 20000, 20000);
    [myMapView setRegion:region animated:YES];
}

我在此屏幕上有一个完成按钮,可以解除此视图:

- (IBAction)mapDoneButton:(id)sender 
{    
    [self dismissModalViewControllerAnimated:YES];
}

在此阶段,用户将被带回主视图控制器,但是当我再次按下视图贴图按钮时,永远不会调用didUpdateUserLocation方法!因此,地图视图缩小为默认值,并且不会像以前一样放大。

我怎样才能让它再次被召唤?

感谢

2 个答案:

答案 0 :(得分:6)

MKMapView对象本身不会触发用户位置的更新。您需要通过设置showsUserLocation = YES来激活搜索。然后,这将获取用户的位置,然后调用委托方法mapView:didUpdateUserLocation:。因此,请将此值设置为YES上的viewWillAppear:,一旦您拥有了用户位置,就可以将其设置为NO以停止跟踪用户。如果不这样做,它会定期更新用户位置并调用委托方法。如果不这样做,用户位置应该不可靠。

答案 1 :(得分:1)

我接下来要做的是:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
[[NSNotificationCenter defaultCenter] postNotificationName:@"gotUserLocation" object:self];}

然后在viewDidLoad中检查用户位置是否可用。如果它不是注册视图控制器作为该通知的接收者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(zoomToLocation) name:@"gotUserLocation" object:nil];

如果用户位置可用,则只需调用zoomToLocation方法