MKMapView не масштабируется правильно, в то время как режим отслеживания пользователей MKUserTrackingModeFollowWithHeading

Я создал тестовый проект с несколькими строками кода и двумя компонентами: MKMapView и UIButton. Я отметил mapView вариант - Shows user location. Также я определил действие для кнопки, оно масштабирует карту до местоположения пользователя.

Вот код от контроллера:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
    self.mapView.delegate = self;
}

- (IBAction)changeRegion:(id)sender {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate, 200.0f, 200.0f);
    [self.mapView setRegion:region animated:YES];
}

Довольно простой и понятный, не так ли? Но когда я нажимаю кнопку, я вижу странное поведение: масштабирование вида карты в указанный регион, а затем возврат к исходному масштабированию. В чем проблема? Как я могу одновременно масштабировать и отслеживать местоположение пользователя?

Я наблюдаю подобное поведение с режимом отслеживания MKUserTrackingModeFollow.

P.S. Я забыл упомянуть, что это проблема в основном для iOS7

Ответ 1

Из документации Apple:

Настройка режима отслеживания на MKUserTrackingModeFollow или MKUserTrackingModeFollowWithHeading вызывает отображение карты в центр карту в этом месте и начните отслеживать местоположение пользователей. Если карта будет уменьшена, отображение карты автоматически увеличит число пользователей местоположение, эффективно изменяя текущую видимую область.

Если вы хотите как настроить регион, так и отслеживать пользователя, я предлагаю вам проверить наличие обновлений местоположения и соответственно изменить масштаб.

Например:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 200.0f, 200.0f);
    [self.mapView setRegion:region animated:YES];
}

ИЗМЕНИТЬ

Вместо настройки области попробуйте просто установить центр,

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    [self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}

и пусть действие вашей кнопки устанавливает масштаб, сохраняя тот же центр:

- (IBAction)changeRegion:(id)sender {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.centerCoordinate, 200.0f, 200.0f);
    [self.mapView setRegion:region animated:YES];
}

И очень важно: не задавайте свой mapView для отслеживания пользователя. Отключите отслеживание пользователя, потому что теперь вы отслеживаете его самостоятельно. Я думаю, что по умолчанию это MKUserTrackingModeNone.