Как указать уровень масштабирования при использовании MKUserTrackingBarButtonItem?
Я использую кнопку MKUserTrackingBarButtonItem
, чтобы пользователь мог автоматически отслеживать их местоположение на карте. Проблема в том, что когда они нажимают эту кнопку, она слишком сильно масштабируется. Я хочу, чтобы он начинался с определенного уровня масштабирования (т.е. Диапазона). Как я могу достичь этого?
Когда пользователь нажал кнопку, чтобы перейти на MKUserTrackingModeFollow
, он, похоже, использует тот же уровень масштабирования, который пользователь последний раз вручную изменил (например, используя жесты на карте). Попытка указать другой уровень масштабирования с помощью setRegion
или setVisibleMapRect
не влияет на то, какой уровень масштабирования будет использоваться при изменении режима на MKUserTrackingModeFollow
.
Попытка override mapView:didChangeUserTrackingMode:
установить область приводит к тому, что режим будет изменен на MKUserTrackingModeNone
. Пример:
- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated {
if (mode == MKUserTrackingModeFollow) {
CLLocationCoordinate2D center = mapView.userLocation.location.coordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717);
[mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];
// [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO];
}
}
Если я попытаюсь выполнить reset режим сразу после настройки области, он отлично работает, если пользователь неподвижен, но увеличивает масштаб, если пользователь движется.
Самое простое решение было бы, если бы можно было просто указать что-то вроде уровня масштабирования для MKUserTraking, отправив его значение моего диапазона. Однако, поскольку это, похоже, не существует, что еще я могу сделать?
Ответы
Ответ 1
У меня была такая же проблема, и я использовал другой подход, чтобы исправить это. Вы можете использовать функцию MapCamera для этого вместо этой кнопки.
В каждом новом месте сделайте следующее:
MKMapCamera *newCamera = [MKMapCamera cameraLookingAtCenterCoordinate:[newLocation coordinate]
fromEyeCoordinate:[oldLocation coordinate]
eyeAltitude:2000];
[mapView setCamera:newCamera animated:TRUE];
И играйте с eyeAltitude.
Если пользователь вручную увеличивает или уменьшает масштаб, вы можете прочитать значение высоты от mapview.camera.altitude также не обновлять камеру, когда пользователь вручную использует карту.
Ответ 2
В соответствии с используемой здесь документацией на Apple
https://developer.apple.com/reference/mapkit/mkmapview/1616208-usertrackingmode
Настройка режима отслеживания для последующего или последующего действия. В режиме "Заголовок" карта отображает центр карты в этом месте и начинает отслеживать местоположение пользователей. Если карта будет уменьшена, отображение карты автоматически увеличится в месте расположения пользователей, эффективно изменив текущую видимую область.
Здесь изменение области не влияет на вашу видимую область по этой причине.
- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated {
if (mode == MKUserTrackingModeFollow) {
CLLocationCoordinate2D center = mapView.userLocation.location.coordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717);
[mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];
// [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO];
}
}
Итак, вам просто нужно изменить координату центра на didChangeUserTrackingMode
вместо изменения всей области
- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated {
if (mode == MKUserTrackingModeFollow) {
[self.mapView setCenterCoordinate:mapView.userLocation.location.coordinate animated:YES];
}
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
[self.mapView setCenterCoordinate:mapViewuserLocation.location.coordinate animated:YES];
}
при нажатии кнопки MKUserTrackingBarButtonItem изменение уровня масштабирования
CLLocationCoordinate2D center = mapView.userLocation.location.coordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717);
[mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];