Как увеличить MKMapView до текущего местоположения пользователя без CLLocationManager?
С MKMapView
есть опция под названием "показать текущее местоположение пользователей", которая автоматически покажет местоположение пользователей на map
.
Я хотел бы переместить и увеличить это место, когда оно будет найдено (и если оно изменится).
проблема в том, что, кажется, не быть любой способ называется, когда местоположение пользователя обновляется на map
, Так что мне некуда поставить код zoom/scroll
.
есть ли способ получать уведомления, когда MKMapView
есть получил (или обновил) местоположение пользователя, чтобы я мог переместить/увеличить его? Если я использую свой собственный CLLocationManager
обновления, которые я получаю, не соответствуют обновлениям пользовательского маркера на карте, поэтому это выглядит глупо, когда моя карта перемещается и масштабируется за несколько секунд до появления синего pin-кода.
это похоже на базовую функциональность, но я потратил недели на поиск решения и не нашел ничего близкого.
6 ответов:
вы должны зарегистрироваться для кво уведомления о
userLocation.location
собственностьMKMapView
.чтобы сделать это, поместите этот код в
viewDidLoad:
вашего ViewController или в любом месте, где ваш вид карты инициализируется.[self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:NULL];
затем реализовать этот метод для получения уведомлений KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([self.mapView showsUserLocation]) { [self moveOrZoomOrAnythingElse]; // and of course you can use here old and new location values } }
этот код отлично работает для меня.
Кстати,self
Это мой ViewController в этом контексте.
Это комбинация ddnv и ответа Дастина, который работал для меня:
mapView-это имя MKMapView *mapView;
в viewDidLoad добавьте эту строку, обратите внимание, что в нагрузке может быть больше строк. Это просто упрощенный.
- (void) viewDidLoad { [self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil]; }
затем создайте фактический метод листинга, который перемещает карту в текущее местоположение:
// Listen to change in the userLocation -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { MKCoordinateRegion region; region.center = self.mapView.userLocation.coordinate; MKCoordinateSpan span; span.latitudeDelta = 1; // Change these values to change the zoom span.longitudeDelta = 1; region.span = span; [self.mapView setRegion:region animated:YES]; }
не забудьте правильно освободить и отменить регистрацию наблюдателя:
- (void)dealloc { [self.mapView.userLocation removeObserver:self forKeyPath:@"location"]; [self.mapView removeFromSuperview]; // release crashes app self.mapView = nil; [super dealloc]; }
С iOS 5.0 Apple добавила новый метод в MKMapView. Этот метод делает именно то, что вы хотите, и больше.
взгляните на: https://developer.apple.com/documentation/mapkit/mkmapview
- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;
вы можете контролировать, когда
MKMapView
обновляет местоположение пользователя на карте, реализуяMKMapViewDelegate
протокол. Просто реализовать:- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy; if (accuracy ......) { } }
этот обратный вызов должен быть идеально синхронизирован с тем, что отображается на карте.
нет проблем... Внутри метода viewDidLoad вашего подкласса UIViewController, который имеет MKMapView, добавьте это (предполагая, что ваш MKMapView называется map):
CLLocation *location = [[[CLLocation alloc] initWithLatitude:map.centerCoordinate.latitude longitude:map.centerCoordinate.longitude] autorelease]; //Get your location and create a CLLocation MKCoordinateRegion region; //create a region. No this is not a pointer region.center = location.coordinate; // set the region center to your current location MKCoordinateSpan span; // create a range of your view span.latitudeDelta = BASE_RADIUS / 3; // span dimensions. I have BASE_RADIUS defined as 0.0144927536 which is equivalent to 1 mile span.longitudeDelta = BASE_RADIUS / 3; // span dimensions region.span = span; // Set the region's span to the new span. [map setRegion:region animated:YES]; // to set the map to the newly created region