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