mapView не масштабируется со второй попытки с помощью didUpdateUserLocation

Я загружаю mapviewcontroller, когда кнопка view map нажата из моего mainviewcontroller:

- (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 ответа

Решение

MKMapView объект не запускает обновление на месте пользователя самостоятельно. Вам нужно активировать поиск, установив showsUserLocation = YES, Затем будет получено местоположение пользователя, а затем метод делегата. mapView:didUpdateUserLocation: называется. Так что установите это значение YES на viewWillAppear: и как только у вас есть местоположение пользователя, вы можете установить его NO прекратить отслеживание пользователя. Если вы этого не сделаете, он периодически обновляет местоположение пользователя и вызывает метод делегата. Без этого местоположение пользователя должно быть ненадежным.

Что я делаю дальше:

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

Другие вопросы по тегам